*COMDECK /TXTCRM/ 
*                                                                       T26A   4
*        BRING IN SYSTEM IPARAMS                                        T26A   5
*                                                                       T26A   6
          IPARAMS                                                       T26A   7
*         BRING INSTALLATION PARAMETERS 
  
          DEFINHF 
  
*                                                                       T26A   8
* 
*         IF MICRO #HF.L# IS EQAL TO L THEN LCM IS AVAILABLE
* 
          IF        MIC,HF.L
 #BETA#   EQU       1 
          ELSE
 #BETA#   EQU       0 
          ENDIF 
* 
*         DELETE DEFINITION OF #CMU# IF YOU DO NOT WANT CMU CODE
*         DELETE DEFINITION OF #NOCMU# IF YOU WANT ONLY CMU CODE
* 
 #CMU#    EQU       1 
 #NOCMU#  EQU       1 
* 
*         IF THE SYMBOL #DEV# IS DEFINED, CERTAIN DEVELOPMENT AIDES 
*         WILL BE ASSEMBLED AND MACRO USAGE ERRORS WILL BE DIAGNOSED. 
* 
          IFEQ      *F,3,1
 #DEV#    EQU       1 
 .IFNOS   IFC       EQ,/"OS.NAME"/KRONOS/ 
 .NOSV2   IF        MIC,NOSVER
 #NODROP# EQU       1 
 .NOSV2   ELSE
 #NODROP# EQU       0 
 .NOSV2   ENDIF 
 .IFNOS   ELSE
 #NODROP# EQU       0 
 .IFNOS   ENDIF 
          TITLE     INTERNAL KEYWORD MICROS 
*#
*1CD  INTERNAL KEYWORD MICROS 
*0D   PURPOSE 
*0        PROVIDE SYMBOLIC REFERENCES FOR FIELDS USED INTERNALLY
*         BY CRM. THESE MICROS HAVE THE SAME FORMAT AS THE *KEYWORD 
*         MICROS*, BUT THEY RESIDE ON A DIFFERENT COMMON DECK, SO 
*         AS TO BE INACCESSIBLE TO THE NORMAL (SYSTEXT/IOTEXT) USER.
*0D   RESIDENCE 
*         COMDECK- C6RMITXT 
*0        TEXT- TXTCRM
*#
* CALL /KWML/               /KWML/   *COMDECK /KWML/
*CALL /KWML/
          TITLE     CKMICRO 
*#
*1CD  CKMICRO MACRO 
*0D   PURPOSE 
*0        VALIDATE A RELATIONSHIP BETWEEN A PAIR OF MICROS. 
*0D   CALL
*0        CKMICRO  A,REL,B
*0D   PARAMETERS
*0        A,B  MICRO NAMES
*0        REL  A LIST OF RELATIONS CORRESPONDING TO THE FIELDS IN MICRO.
*              NULL - REQUIRE EQUALITY
*              X - DONT CARE
*              +N,-N - THE FIELD IN A +/-N = THE FIELD IN B 
*0D   ACTION
*0        ISSUE ASSEMBLY ERROR IF MICROS DO NOT MATCH.
*#
 CKMICRO  MACRO     A,REL,B 
          ECHO      3,C=#_A_#,D=#_B_# 
          ECHO      2,NA=("C"),NB=("D"),ADD=(REL) 
          IFC       NE, ADD X ,1
          ERRNZ     NA_ADD-NB "SEQUENCE" DEPENDS ON A B 
 CKMICRO  ENDM
          TITLE     COMPOSED
*#
*1CD  COMPOSED MACRO
*0D   PURPOSE 
*0        VERIFY THAT ONE MICRO IS COMPOSED, EXACTLY, OF TWO OTHERS.
*0D   CALL
*0        MICA      COMPOSED  MICB,LENB,MICC,LENC 
*0D   PARAMETERS
*0        MICA      THE BIG MICRO 
*0        MICB,LENB THE LEFT-HAND MICRO AND ITS LENGTH
*0        MICC,LENC THE RIGHT-HAND MICRO AND ITS LENGTH.
*#
          MACRO     COMPOSED,A,B,LB,C,LC
          CKMICRO   B,(,,+LC,-LC),A 
          CKMICRO   C,(,,+LB,),A
 COMPOSED ENDM
          CKMICRO   GETJ,(,),FOJG 
          CKMICRO   GETJ,(,),RTJG 
 LAL      COMPOSED  LLB,18,FWL,18 
 OWF      COMPOSED  OWM,1,OWN,1 
          CKMICRO   PPT,(,,,),PRD 
          CKMICRO   PUTJ,(,),FOJP 
          CKMICRO   PUTJ,(,),RTJP 
* CALL CMNTXT 
*CALL /CMNTXT/
 TITLE    SPACE     4,8 
          TITLE     MICROS AND EQU-S
 #MSKREG# MICRO     1,,/7/
 DEFILE   MICRO     1,,/ZZZZZDG/
 ERRREG   MICRO     1,, X6
 SLSZ.RM  EQU       51D 
 DGSZ.RM  EQU       2+2*#FTL#+SLSZ.RM 
 FWRD.RM  MICRO     1,,/999/       NO WORD OF FIT IN A XREG 
 #.WD#    MICRO 
 PD.I     EQU       #OPE#*1S3+#INPUT# 
 PD.O     EQU       #OPE#*1S3+#OUTPUT#
          TITLE     BXQ OPDEF 
***       BXQ - ZERO A REGISTER WITH A BOOLEAN INSTRUCTION. 
*     AN OPDEF TO SET A REGISTER TO 0 OR -0 USING A BOOLEAN INSTRUCTION.
*         BX.I   0
*         BX.I   -0 
 BXQ      OPDEF  I,K
          IFPL   K,2
          BX.I   X.I-X.I
          SKIP   1
          BX.I   -X.I-X.I 
 BXQ      ENDM
          SPACE     20,40 
 F.RM     CLASS    (FETCH MACROS) 
*#
**    CRM 1.5 IMS   COPYRIGHT CONTROL DATA SYSTEMS INC.  1994 
**    CHAPTER 2     MACROS AND SYMBOLS
**    SECTION 3     INTERNAL MACROS                      DATE 
*DX              INTERNAL MACROS
*1DC  FETCH MACROS
*[    +---------------------------------------------------------------+ 
*X    FETCH MACROS
*0        LOAD THINGS OUT OF THE FIT. 
*0     ---------------------------------------------------------------
*0D       F.RM (FIND1, F2.6RM, F-O.RM, F.0.RM, F-18.RM, F-60.RM,
*0D            F-N.RM)
*                 FETCH A FIELD FROM THE FIT. 
*0D       RESTORE 
*                 POP THE B6 STACK. 
*0D       PUT.IN, IS.IN 
*                 LOAD A REGISTER WITH A WHOLE WORD OF THE FIT. 
*0D       SOL*10
*                 ADD TEN IF S/L TAPE.
*[    +---------------------------------------------------------------+ 
*#
          TITLE     F.RM
*#
*1CD  F.RM MACRO
*0D   PURPOSE 
*         RETRIEVE A FIELD FROM THE FIT 
*0D   CALLING SEQUENCE
*         F.RM      FIELD[,RET-REG[,ALT-REG[,INC-EXP[,MSK-REG]]]] 
*0D   PARAMETERS
*         FIELD    -FIT MNEMONIC FOR FIELD TO BE RETRIEVED. 
*         RET-REG  -RETURN X REGISTER NUMBER, IF NULL, 1 (X1) 
*                   IS ASSUMED, MUST BE 0-5.
*         ALT-REG  -NAME OF ALTERNATE REGISTER WHEREIN
*                   FIELD WILL BE RETURNED INSTEAD OF RET-REG.
*                   CAN BE X, A, OR B REGISTER. 
*         INC-EXP  - +EXP OR -EXP, VALUE BY WHICH TO INCREMENT OR 
*                   DECREMENT (ALT-REG).
*                   INC-EXP IS ONLY EFFECTIVE FOR FIT FIELDS
*                   18 BITS OR SMALLER IN LENGTH. 
*         MSK-REG  -X REG. TO USE FOR MASK, IF NULL, 7 (X7) 
*                   IS ASSUMED. MUST NOT BE RET-REG, ALT-REG
*                   OR CONTAINED IN INC-EXP.
*                   THE DEFAULT OF 7 CAN BE CHANGED BY CHANGING 
*                   #MSKREG#. 
*         A0       -ADDRESS OF FIT. 
*         A2       -ADDRESS OF FET IF #FETA2# IS SET 1, 
*         X0        ID OF ENTRY IF FIELD REFERS TO MCT
*                   IRRELEVANT OTHERWISE. 
*0D   ACTIONS 
*         THE VALUE IN FIELD IS RETURNED IN X.<RET-REG>. IF FIELD 
*         IS ONE BIT, IT IS RETURNED IN THE SIGN BIT OF X.<RET-REG> 
*         WITH GARBAGE FILL. IF NOT, IT IS RETURNED RIGHT JUSTIFIED 
*         WITH ZERO FILL. 
*0        IF *ALT-REG* IS SPECIFIED, X.<RET-REG> WILL BE GARBAGE FILL 
*         IF FL=18. IF *ALT-REG* IS SPECIFIED AND FL=1, VALUE IS
*         RETURNED IN *ALT-REG* RIGHT-JUSTIFIED ZERO-FILL - *RET-REG* 
*         DOES NOT HAVE FIELD IN SIGN BIT.
*         IF INC-EXP IS GIVEN, CARE SHOULD BE EXERCISED THAT FIELD IS 
*         NOT IN EXCESS OF 18 BITS IN LENGTH.  NEGATIVE ZERO IS 
*         CONVERTED TO POSITIVE ZERO. 
*0D   REGISTER USAGE
*0     1. DESTROYED 
*         A.<RET-REG>, X.<RET-REG>
*         <ALT-REG> 
*         X.<MSK-REG> 
*0     2. PRESERVED 
*         ALL OTHERS
*0D   OTHER CODE
*0        MACROS-   FIND1, CT.6RM 
*         PROGRAMS- NONE
*#
 F.RM     MACRO     FIELD,RN,RES,ADD,MSK
          IF        DEF,#DBGCT#,4 
          SB1       X7
          CT.6RM  RN,MSK,FIELD
          SX7       B1
          SB1       1 
          IF        -MIC,#_FIELD_#,2
          ERR       FIELD NOT DEFINED 
          SKIP
          IF        REG,RN,2
          FIND1     FIELD,"#_FIELD_#",,RN,RES,ADD 
          SKIP
          ERRPL     RN-6 ILLEGAL READ REG "SEQUENCE"
          FIND1     FIELD,"#_FIELD_#",RN,RES,ADD,MSK
          ENDIF 
 F.RM     ENDM
          TITLE     FIND1 
*#
*1CD  FIND1 MACRO AND (SEE NOTE) F2.6RM MACRO 
*0D   PURPOSE 
*0        DO CODE GENERATION FOR *F.RM*, TO FETCH A FIELD FROM THE
*         FIT.
*0D   CALL
*0        [TAG]     FIND1     TABL,WRD,FL,POS,D1,D2[,PR,RES,ADD,PMSK] 
*0D   PARAMETERS
*0        TABL      0 - FIT,
*                   1 - FET.
*0        WRD       WORD WITHIN TABLE - FROM ZERO (FIT) OR ONE (FET). 
*0        FL        LENGTH OF FIELD - BITS. 
*0        POS       BEGINNING BIT POSITION OF FIELD.
*0        D1,D2     NOT USED. 
*0        PR        FETCH REGISTER, DEFAULT IS 1. 
*0        RES       ADDITIONAL RESULT REGISTER (ADDITIONAL TO X.PR).
*                   X, A, OR B REGISTER SPECIFICATION, E.G. X5, B4 ...
*0        ADD       EXPRESSION TO BE ADDED TO RESULT, I.E.
*0C                 S_RES     X.PR_ADD
*0                  IS THE KIND OF CODE GENERATED.
*0        PMSK      MASK REGISTER. DEFAULT IS 7.
*0        A0        ADDRESS OF FIT. 
*0        #FETA2#   SET SYMBOL. IF NE ZERO AND TABL EQ 1 THE MACRO
*                   ASSUMES THE FET ADDRESS IS IN A2, ELSE; IT FETCHES
*                   THE FET ADDRESS FROM THE FIT. 
*0        #DBG#     INSTALLATION PARAMETER. IF DEFINED AND #FETA2#
*                   EQ 1, THEN A CHECK IS GENERATED TO SEE IF A2
*                   REALLY CONTAINS THE FIT ADDRESS. IF NOT, A
*0C                 SA.PR     500002B   (MODE 1 ERROR)
*0                  IS EXECUTED.
*         B1        1 (SEE NOTE)
*0D   ACTION
*0        GENERATES IN-LINE COMPASS CODE TO FETCH THE FIELD FROM THE
*         APPROPRIATE TABLE.
*0D   REGISTERS 
*0        AX.PR, X.PMSK, RES, ANY REGISTERS USED IN *ADD*.
*0D   OTHER CODE
*0        MACROS-   CKA2, F2.6RM
*0D   NOTE
*0        F2.6RM IS CALLED IF THE WORD IN THE TABLE IS ALREADY IN AN
*         X REGISTER WHEN FIND1 IS CALLED. FIND1 TESTS THE VALUE OF 
*         MICRO FWRD.RM AGAINST *WRD*. IF EQ, IT IS ASSUMED THAT THE
*         CONTENTS OF X."XREG.RM" CONTAIN A COPY OF THE TABLE WORD TO 
*         BE FETCHED. F2.6RM IS SMART ENOUGH, FOR INSTANCE, TO MERELY 
*         GENERATE A
*0C       LX.PR     X."XREG.RM",B1
*0        IF *FL* IS 1 AND *POS* IS 58. 
*#
 FIND1    MACRO     FIELD,TABL,WRD,FL,POS,D1,D2,PR,RES,ADD,PMSK 
 '_FIELD  SET       WRD 
 '?RX1.RM        SET    PR 1
#.R#      DECMIC    '?RX1.RM
 '?MX7.RM      SET    PMSK "#MSKREG#" 
          IFEQ      WRD,"FWRD.RM",1 
          F2.6RM    FL,POS,D1,D2,'?RX1.RM,RES,ADD,'?MX7.RM
*                                  F2.6RM WILL SKIP 
 MFL.     MICRO     1,2,/FL/
          IFNE      FL,60,2 
          IFNE      FL,18,1 
          F-O.RM    TABL,WRD,FL,POS,RES,'?RX1.RM,'?MX7.RM,ADD 
*                                  F-O.RM WILL SKIP 
          F.TABL.RM WRD,'?RX1.RM,'?MX7.RM 
          F-"MFL.".RM  '?RX1.RM,RES,POS,ADD 
RM.Z      SKIP
RM.RA     ENDIF 
*                                  OTHER RES
          S_RES     X.'?RX1.RM_ADD
          ENDIF 
 FIND1    ENDM
          TITLE  F2.6RM  MACRO  FL,POS,D1,D2,RR,RES,ADD,MSK 
 F2.6RM   MACRO     FL,POS,D1,D2,RR,RES,ADD,MSK 
 6RM.1    IFEQ      FL,1
 6RM.1    IFC    EQ, RES
          IFEQ      POS,58,2
          LX.RR     B1,X."XREG.RM"
          SKIP      3 
          BX.RR     X."XREG.RM" 
          IFLT      POS,58,1
          LX.RR     59-POS
 6RM.1    ELSE
 6RM.18   IFEQ      FL,18 
          F-18.RM   "XREG.RM",RES,POS 
RM.RA     ELSE      1 
          S_RES     X."XREG.RM"_ADD 
          IFNE      POS,0,1 
          LX."XREG.RM" POS
 6RM.18   ELSE
 RM.T     IFEQ      POS+FL,60                                           0057   5
          MX.MSK    FL                                                  0057   6
          BX.'?RX1.RM X.MSK*X."XREG.RM"                                 0057   7
          LX.'?RX1.RM FL                                                0057   8
 RM.Z     IFC       NE, RES                                             0057   9
 RM.RA    SKIP                                                          0057  10
 RM.T     ELSE                                                          0057  11
          MX.MSK    60-POS-FL 
*                                  EXTRACT
          F-N.RM    RES,ADD,-X.MSK*X."XREG.RM",POS
 F2.6RM   ENDM
  
          TITLE     F-O.RM
 F-O.RM   MACRO     TABL,WRD,FL,POS,RES,RX1,MX7,ADD 
RM.Z      IFEQ      FL,1
RM.Z      IFC       EQ, RES 
*                                  1 BIT FIELD, NO RESULT REG 
          F.TABL.RM WRD,RX1,MX7 
          IFNE      POS,59,1
          LX.RX1    59-POS
RM.Z      ELSE
*                                  LOAD WORD AND FORM MASK
          IFEQ      $,14,3
          MX.MX7    -FL 
          F.TABL.RM WRD,RX1,MX7,(MX.MX7 -FL)
          SKIP      2 
          F.TABL.RM WRD,RX1,MX7 
          MX.MX7    -FL 
*                                  POSITION WORD
          IFNE      POS,,1
          LX.RX1    -POS
*                                  EXTRACT
          F-N.RM    RES,ADD,-X.MX7*X.RX1
 F-O.RM   ENDM
          TITLE     F.0.RM,F.3.RM 
*#
*1CD  F.0.RM MACRO
*0D   PURPOSE 
*0        LOAD SPECIFIED FIT WORD.
*0D   CALL
*0        [TAG]     F.0.RM    WRD,RR
*0D   PARAMETERS
*0        WRD       WORD IN TABLE TO LOAD (FIRST WORD = 0). 
*0        RR        READ REGISTER.
*0D   ACTION
*0        IF THE MICRO *FWRD.RM* EQUALS *WRD*, NO CODE IS GENERATED;
*         X.RR IS ASSUMED TO CONTAIN THE REQUIRED WORD. 
*         OTHERWISE, THE COMPASS MACRO R= IS USED TO GENERATE A 
*         SA.RR   A0+WRD. 
*0D   REGISTERS USED
*0        AX.RR 
*0D   OTHER CODE
*0        NONE
*#
 F.0.RM   MACRO     WRD,RR
#.R#      DECMIC    RR
          IFNE      WRD,"FWRD.RM",2 
#.W#      DECMIC    WRD 
          R=        A"#.R#",A0+"#.W#" 
 F.0.RM   ENDM
          TITLE     F-18.RM 
 F-18.RM  MACRO     RX1,RES,POS 
          IFNE      POS,,1
          LX.RX1    -POS
RM.RA     IFC       EQ, RES 
          SX.'?RX1.RM X.RX1 
 F-18.RM  ENDM
          TITLE     F-60.RM 
 F-60.RM  MACRO     RX1,RES,POS,ADD 
RM.Z      IFC       NE, RES 
RM.RA     IFC       GT, RES X 
RM.RA     IFC       EQ, ADD 
          B_RES     X.RX1 
 F-60.RM  ENDM
          TITLE     F-N.RM
 F-N.RM   MACRO     RES,ADD,EXTRACT,POS 
RM.Z      IFC       GT, RES X 
RM.Z      IFC       EQ, ADD 
*                                  RES=X.N, ADD=NULL
          B_RES     EXTRACT 
          IFNE      POS,,1
          A_RES     POS 
RM.Z      ELSE
*                                  OTHER COMBINATIONS 
          BX.'?RX1.RM EXTRACT 
          IFNE      POS,,1
          AX.'?RX1.RM POS 
RM.Z      IFC       NE, RES 
RM.RA     SKIP
 F-N.RM   ENDM
          TITLE      RESTORE  MACRO 
*#
*1CD  RESTORE MACRO 
*0D   PURPOSE 
*0        RESTORE THE RETURN ADDRESS TO A SUBROUTINE FROM A STACK TO
*         B6
*0D   CALL
*0                  RESTORE 
*0D   PARAMETERS
*0        #FETA2#   0 IF FET ADDRESS NOT IN A2, 
*                   1 IF IT IS. 
*0        B1        1 
*0        A0        FIT ADDRESS.
*0        A2        FET ADDRESS (DEPENDING ON #FETA2#). 
*0D   ACTION
*0        RETRIEVES THE MOST RECENT RETURN ADDRESS IN THE *B6 STACK*
*         (FET+7) AND PUTS IT INTO B6.
*0D   REGISTERS 
*         AX17, B6
*#
 RESTORE  MACRO 
 <RESTOR> SET       0 
          SA1       A0+7
          SB6       X1
          AX1       18
          BX7       X1
          SA7       A1
 RESTORE  ENDM
          TITLE     IS.IN 
*#
*1CD  PUT.IN AND IS.IN
*0D   PURPOSE 
*0        PUT.IN - LOAD A REGISTER WITH A WORD OF THE FIT AND NOTIFY
*                  F.RM AND SET.RM OF ITS PRESENCE. 
*0        IS.IN - SAME AS PUT.IN BUT WITHOUT THE ACTUAL LOAD. 
*0D   COMMUNICATION 
*0        THE MICRO  XREG.RM  SAYS WHICH REGISTER CONTAINS THE FIT WORD.
*0        THE MICRO  FWRD.RM  SAYS WHICH FIT WORD.
*#
 IS.IN    SPACE     4,8 
          MACRO     IS.IN,WRD,REG 
          IFC       EQ, WRD 
          IFGE      "FWRD.RM",100B,1
 FWRD.RM  DECMIC    "FWRD.RM"-100B
          ELSE
 FWRD.RM  MICRO     1,, WRD 
 XREG.RM  MICRO     1,, REG 
          ENDIF 
 IS.IN    ENDM
          TITLE     PUT.IN
          MACRO     PUT.IN,WRD,REG,LOAD 
 WRD      IS.IN     REG 
          IFEQ      "XREG.RM"/"XREG.RM","XREG.RM"/6 
 '?RX1.RM SET       LOAD 1
          SA.'?RX1.RM  A0+"FWRD.RM" 
          BX"XREG.RM" X.'?RX1.RM
          ELSE      1 
          SA"XREG.RM" A0+"FWRD.RM"
 PUT.IN   ENDM
          TITLE     SOL*10
 SOL*10   MACRO     XN,ADD
          F.RM      SOL,1 
          SX7       10
          AX1       59
          BX7       X1*X7 
          I_XN      XN_ADD_X7 
 SOL*10   ENDM
          SPACE     20,40 
 SET.RM   CLASS    (STORE MACROS) 
*#
*1DC  STORE MACROS
*[    +---------------------------------------------------------------+ 
*X    STORE MACROS
*0        STORE THINGS INTO THE FIT.
*0     ---------------------------------------------------------------
*0D       SET.RM (SETBL, S60.RM, S=0.CRM, S=1.6RM, SIZ.RM)
*                 STORE A FIELD INTO THE FIT. 
*0D       SET.FOJ 
*                 SET FOJP OR FOJG AFTER CAPSULE LOADED BY GET/PUT. 
*0D       STO.REG 
*                 STORE A WHOLE WORD BACK INTO THE FIT. 
*0D       SAVE
*                 PUSH THE B6 STACK.
*0D       DEF.RM (DEF2.RM)
*                 DEFAULT A FIT FIELD TO A SPECIFIED VALUE. 
*[    +---------------------------------------------------------------+ 
*#
          TITLE     SET.RM
*#
*1CD  SET.RM MACRO
*0D   PURPOSE 
*0        PLACE A VALUE IN AN FIT FIELD.
*0D   CALLING SEQUENCE
*0        [TAG]     SET.RM    FIELD,VALUE[,WN[,RD[,SIZCK]]] 
*0D   PARAMETERS
*0        FIELD    -FIELD (KEYWORD) TO BE STORED INTO.
*0        VALUE    -DIRECT EXPRESSION OR REGISTER GIVING VALUE TO BE
*                   STORED.  IF VALUE IS A REGISTER, WATCH OUT
*                   FOR FIELD/REGISTER LENGTH COMPATIBILITY.
*0        WN       -STORE REGISTER TO BE USED, 6 OR 7. DEFAULT IS 7.
*0        RD       -FETCH REGISTER TO BE USED, 1 TO 5. DEFAULT IS 1.
*0        SIZCK    -IF VALUE IN X REG OVERFLOWS FIELD, AND SIZCK IS 
*                    NUMERIC, JUMP TO BIG.SIZCK(IF NOT DEFINED ISSUE
*                    ERROR NUMBER SIZCK)
*                   IF SIZCK=TRUNC, MERELY CHOP THE VALUE IN X REG
*                   IN EITHER CASE, VALUE IN X REG WILL BE DESTROYED. 
*0        A0       -ADDRESS OF FIT.                                     KEY00130
*0        A2       -ADDRESS OF FET IF #FETA2# IS SET 1,                 KEY00140
*                    IRRELEVANT OTHERWISE.                              KEY00150
*0D   ACTIONS 
*0        VALUE IS STORED IN FIELD. 
*0D   REGISTERS 
*      1. DESTROYED 
*         A.WN, X.WN, A.RD, X.RD
*      2. PRESERVED 
*         ALL OTHERS
*0D   OTHER CODE
*0        MACROS-   SETBL, SF=60, S=1.6RM, S=O.6RM
*#
 SET.RM   MACRO     FIELD,VALUE,WN,RD,SIZCK 
 '?WX7.RM        SET       WN 7 
 '?RX1.RM        SET       RD 1 
          IF     DEF,#DBGCT#,1
          CT.6RM '?RX1.RM,'?WX7.RM,FIELD
          ERRNZ '?WX7.RM/6-'?RX1.RM/6-1 WN<6 OR RN>5 "SEQUENCE" 
          IF        -MIC,#_FIELD_#,2
          ERR      MICRO FIELD NOT DEFINED
          SKIP     1
          SETBL     FIELD,"#_FIELD_#",VALUE,'?WX7.RM,'?RX1.RM,SIZCK 
          ENDIF 
 SET.RM   ENDM
          TITLE     SETBL 
*#
*1CD  SETBL MACRO 
*0D   PURPOSE 
*0        DO THE WORK FOR SET.RM (STORE A FIELD IN A FIT) 
*0D   CALL
*0                  SETBL     TABL,WRD,FL,POS,D1,D2,VAL,W,R 
*0D   PARAMETERS
*0        TABL-D2   PARAMETERS FROM A *KEYWORD* MICRO.
*0        VAL       VALUE TO BE STORED IN *TABL*. MAY BE A DIRECT 
*                   VALUE (E.G. 20), OR THE CONTENTS OF ANY X OR B
*                   REGISTER. 
*0        W         WRITE REGISTER; DEFAULT 7 (AX7).
*0        R         READ REGISTER; DEFAULT 1 (AX1). 
*0        FWRD.RM   MICRO WHOSE VALUE IS = *WRD* IF X.R CONTAINS A
*                   COPY OF THE FIT WORD TO BE STORED; ELSE JUNK. 
*0        #FETA2#   0 IF (A2) NE FET; ELSE 1. 
*         FWRD.RM   MICRO - EQ ACTUAL VALUE OF *WRD* OR NOT.
*0        A0        FIT ADDRESS 
*0        #1#       MICRO. VALUE IS *B1* IF IN CRM (SET IN TEXT) OR 
*                   MAY BE RE-SET TO 1 IF INTERNAL CODING CONVENTIONS 
*                   DO NOT REQUIRE B1 = 1 (USING TXTCRM TO ASSEMBLE 
*                   SOME NON-CRM STUFF).
*0D   ACTION
*0        IF VALUE OF FWRD.RM IS NOT *WRD*, A.R IS SET TO THE ADDRESS 
*         OF THE WORD TO BE STORED, X.RR CONTAINS A COPY OF ITS CON-
*         TENTS.
*0        IF A 60-BIT FIELD (FL=60), *S60.RM* IS CALLED; ELSE ... 
*0        IF A 1-BIT FIELD (FL=1), *S=1.6RM* IS CALLED; ELSE
*         *S=O.6RM* IS CALLED.
*0        IF VALUE OF FWRD.RM NE *WRD* THE ACTUAL VALUE OF *VAL* IS 
*         STORED BACK IN THE FIT. 
*0D   REGISTERS 
*         AX.R/W
*0D   OTHER CODE
*0        MACROS-   S60.RM, S=O.6RM, S=1.6RM, F.TABL.RM 
*#
 SETBL    MACRO     FIELD,TABL,WRD,FL,POS,DUM1,DUM2,VALUE,W,R,SIZCK 
 ?_FIELD_? SET      WRD 
#.W#      DECMIC    W 
          IFEQ      FL,60,2 
          S60.RM    TABL,WRD,VALUE,"#.W#",R 
RM.60     SKIP
          IFC       NE, SIZCK  ,1 
          SIZ.RM    FL,W,R,VALUE,SIZCK
          F.TABL.RM WRD,R,W 
          IFEQ      FL,1,3
          IF        -REG,VALUE,2
          S=1.6RM   VALUE,WRD,W,POS,R 
          SKIP      1 
          S=O.CRM   VALUE,WRD,W,R,FL,POS,B,SIZCK
          IFNE      WRD,"FWRD.RM",1 
          SA.W      A.R 
RM.60     ENDIF 
 SETBL    ENDM
 .IFNOS   IFC       EQ,/"OS.NAME"/KRONOS/ 
 .NOSV2   IF        MIC,NOSVER
          TITLE     SET.FS
 SET.FS   OPSYN     SETFS 
          PURGMAC   SETFS 
 .NOSV2   ENDIF 
 .IFNOS   ENDIF 
          TITLE      SF=60    MACRO     TABL,WRD,VALUE,W,R
*#
*1DC  S60.RM MACRO
*0D   PURPOSE 
*0        STORE A 60-BIT FIELD IN A FIT OR FET FOR MACRO SET.RM.
*0D   CALL
*0        [TAG]     S60.RM    TABL,WRD,VALUE,W,RR 
*0D   PARAMETERS
*0        TABL      0 = FIT   1 = FET 
*0        WRD       WORD WITHIN TABLE - FROM ZERO (FIT) OR ONE (FET). 
*0        VALUE     VALUE TO BE STORED OR REGISTER CONTAINING THE VALUE.
*0        W         WRITE REGISTER (DEFAULT = 7). 
*0        RR        READ  REGISTER (DEFAULT = 1). 
*0        A0        FIT ADDRESS 
*0        B1        1 
*0D   ACTION
*         LOAD  A.RR  WITH FIT ADDRESS+1 (X.RR THEN CONTAINS FET
*         ADDRESS IN BITS 0-17).
*0        IF #DBG# IS DEFINED AND #FETA2# = 1, CALL MACRO CKA2 TO 
*         CHECK THAT  A2  CONTAINS THE CORRECT FET ADDRESS. 
*0        IF *VALUE* IS AN  X-REGISTER, ISSUE A  BX.W   VALUE  .
*         IF *VALUE* IS NOT AN X-REGISTER, USE THE COMPASS MACRO
*         R= TO LOAD *VALUE* INTO  X.W. 
*0        THEN IF TABL=0 (FIT), ISSUE A  SA.W  A0+WRD.
*         IF TABL"0 (FET) AND A2 CONTAINS THE FET ADDRESS, USE THE
*         COMPASS MACRO R= TO ISSUE A  SA.W   A2+WRD-1. 
*         IF TABL"0 (FET) AND A2 DOES NOT CONTAIN THE FET ADDRESS, USE
*         THE COMPASS MACRO R= TO ISSUE A   SA.W   X.RR+WORD-1. 
*0D   REGISTERS USED
*0        AX.W/RR 
*0D   OTHER CODE
*         MACROS-   CKA2
*         PROGRAMS- NONE
*#
 S60.RM   MACRO     TABL,WRD,VALUE,W,RR 
*     SET X7 TO VALUE 
          IF        REG,VALUE 
          IFC       GT, VALUE X 
          IFNE      X.W,VALUE,3 
          BX.W      VALUE 
          ELSE      1 
          R=        X_W,VALUE 
*     STORE X7
          SA.W      A_TABL+WRD
 S60.RM   ENDM
          TITLE     S=O.CRM 
*#
*1CD  S=O.CRM MACRO 
*0D   PURPOSE 
*0        SET UP A FIELD FOR STORING INTO FIT OR FET. 
*0D   CALL
*0        [TAG]     S=O.CRM   VALUE,WRD,W,R,FL,POS,INCR,SIZCK 
*0D   PARAMETERS
*0        VALUE     VALUE TO BE STORED. 
*0        WRD       WORD IN TABLE TO STORE FIELD (FROM 0 FIT  1 FET). 
*0        W         WRITE REGISTER (IN WHICH TO FORM FIT (FET) WORD). 
*0        R         READ REGISTER (CURRENT CONTENTS OF FIT (FET) WORD). 
*0        FL        LENGTH OF FIT FIELD.
*0        POS       LOW-ORDER BIT POSITION OF FIELD 
*0        INCR      NOT USED. 
*0        SIZCK     -TRUNC- TO CHOP OR AN ERROR NUMBER TO CHECK SIZE. 
*0D   ACTION
*0        IF THE MICRO *FWRD.RM* IS EQUAL TO *WRD*, SET  W  TO  XREG.RM.
*0        RIGHT-JUSTIFY AND ZERO OUT THE SPECIFIED FIELD IN THE FIT OR
*         FET IN  X.W.
*0        IF THE VALUE IS IN AN X-REGISTER, OR IT INTO  X.W; GENERATE 
*         A          JUMP TO 500000B+* (MODE 1) IF THE CRM DEBUG FLAG 
*         (#DBG#) IS DEFINED AND THE VALUE TO BE STORED IS NEGATIVE.
*0        IF THE VALUE IS NOT IN AN X-REGISTER AND IS NOT ZERO, PUT 
*         IT IN  X.R  AND OR IT INTO  X.W, AND IF THE CRM DEBUG FLAG
*         (#DBG#) IS DEFINED, GENERATE A JUMP TO 500000B+* (MODE 1).
*0        FINALLY, IF POS IS NON-ZERO, X.W IS SHIFTED *POS* PLACES. 
*0        NOTE THIS MACRO IS USED PRIMARILY BY MACRO  SETBL  WHICH IS 
*         CALLED BY MACRO  SET.RM 
*0D   REGISTERS USED
*0        X.W,X.R 
*         X."XREG.RM" IF *FWRD.RM" EQ *WRD* 
*0D   OTHER CODE
*0        NONE
*#
 S=O.CRM  MACRO     VALUE,WRD,W,R,FL,POS,INCR,SIZCK 
 .0       IFC       EQ, VALUE 0 
 .0       IFNE      POS 
          MX.W      FL
          IFNE      POS+FL,60,1 
          LX.W      POS+FL
          IFEQ      WRD,"FWRD.RM",2 
          BX."XREG.RM" -X.W*X."XREG.RM" 
          SKIP      1 
          BX.W      -X.W*X.R
 .0       ELSE
 6RM.RG   IFEQ      WRD,"FWRD.RM" 
          IFNE      POS,0,1 
          LX."XREG.RM" -POS 
          IFC       EQ, SIZCK  ,1 
          MX.W      -FL 
          BX."XREG.RM" X.W*X."XREG.RM"
 W        SET       "XREG.RM" 
 6RM.RG   ELSE
          IFC       EQ, SIZCK  ,1 
          MX.W      -FL 
          IFNE      POS,0,1 
          LX.R      60-POS         SHIFT FIELD TO BOTTOM OF WORD
          BX.W      X.W*X.R 
 6RM.RG   ENDIF 
6RM.RE    IF        REG,VALUE 
6RM.X     IFC       LT, VALUE X 
6RM.X     ELSE
          BX.W      VALUE+X.W 
          IF     DEF,#DBG#,1
          NG     VALUE,500000B+*
6RM.RE    ELSE
6RM.X     IF        DEF,VALUE 
6RM.RE    IFNE      VALUE,0 
6RM.X     ENDIF 
          SX.R      VALUE 
          BX.W      X.W+X.R        OR FIELD INTO WORD 
          IF     DEF,#DBG#,1
          NG     X.R,500000B+*
6RM.RE    ENDIF 
          IFNE      POS,0,1 
          LX.W      POS            RESHIFT WORD TO NORMAL POSITION
 .0       ENDIF 
 S=O.CRM  ENDM
          TITLE      S=1.6RM   MACRO     VALUE,WRD,W,POS,R
*#
*1CD  S=1.6RM MACRO 
*0D   PURPOSE 
*0        SET UP A 1-BIT FIELD (= 0 OR 1) FOR STORING INTO FIT OR FET.
*0D   CALL
*O        [TAG]     S=1.6RM   VALUE,WRD,W,POS,RR
*0D   PARAMETERS
*0        VALUE     VALUE TO BE STORED   0 OR 1.
*0        WRD       WORD IN TABLE TO STORE FIELD (FROM 1 FIT  0 FET). 
*0        W         WRITE REGISTER (IN WHICH TO FORM FIT (FET) WORD). 
*0        POS       BIT POSITION OF FIELD 
*O        RR        READ REGISTER (CURRENT CONTENTS OF FIT (FET) WORD). 
*0D   ACTION
*0        SET A 1 IN  X.W  IN THE BIT POSITION SPECIFIED BY *POS*.
*0        DEFINE A MICRO #.S# =  X.W+   IF VALUE = 1 TO STORE A  1
*         DEFINE A MICRO #.S# = -X.W*   IF VALUE = 0 TO STORE A  0
*0        IF THE MICRO *FWRD.RM* EQUALS *WRD*, MICRO *XREG.RM* CONTAINS 
*         THE SOURCE AND RESULT REGISTER SO PERFORM A BOOLEAN OPERATION 
*         USING MICROS  #.S# AND XREG.RM. 
*0        IF THE MICRO *FWRD.RM* IS NOT EQUAL TO *WRD*, PERFORM A 
*         BOOLEAN OPERATION USING #.S# AND X.RR (SET UP IN MACRO
*         F.TABL.RM) WITH THE RESULT IN  X.W. 
*0        NOTE THIS MACRO IS UED PRIMARILY BY MACRO  SETBL   WHICH IS 
*         CALLED BY MACRO  SET.RM 
*0D   REGISTERS USED
*0        X.W 
*         X.RR IF *FWRD.RM* NE *WRD*
*         X."XREG.RM" IF *FWRD.RM* EQ *WRD* 
*0D   OTHER CODE
*0        NONE
*#
 S=1.6RM  MACRO     VALUE,WRD,W,POS,RR
 6RM.P    IFEQ      POS,59
          MX.W      1 
 6RM.P    ELSE
 #.W#     DECMIC    W 
          R=        X"#.W#",1 
          IFNE      POS,0,1 
          LX.W      POS            SHIFT TO FIELD POSITION
 6RM.P    ENDIF 
*     SET TO 0 OR 1 
 #.S#     MICRO     1,, X.W+
          IFEQ      VALUE,0,1 
 #.S#     MICRO     1,, -X.W* 
*     DO BOOLEAN
          IFEQ      WRD,"FWRD.RM",2 
          BX"XREG.RM"  "#.S#"X"XREG.RM" 
          SKIP      1 
          BX.W      "#.S#"X.RR
 S=1.6RM  ENDM
          TITLE     SIZ.RM
*#
*         CHECK THE VALUE BEING STORED. 
*         IF SIZCK IS NUMERIC, ISSUE IT AS AN ERROR NUMBER IF THE 
*         VALUE IS TOO BIG TO FIT.
*         IF SIZCK=TRUNC, MERELY CHOP THE VALUE.
*#
 SIZ.RM   MACRO     FL,W,R,VALUE,SIZCK
          MX.W      -FL 
 .1       IFC       LT, SIZCK 0 
          B_VALUE   -X.W*VALUE
 .1       ELSE
          BX.R      X.W*VALUE 
          NZ        X.R,BIG.SIZCK 
          RMT 
 .2       IF        -DEF,BIG.SIZCK
          LIST      D 
 BIG.SIZCK  SX6     SIZCK_B 
          IFLT      SIZCK,714,2 
          EQ        =XERR$RM
          SKIP      1 
          EQ        =XRM$EREX 
 .2       ENDIF 
          RMT 
 .1       ENDIF 
 SIZ.RM   ENDM
          TITLE     SET.FOJ - SET FOJX
*#
*1CD  SET.FOJ MACRO 
*0D   PURPOSE 
*0        GET AND PUT ROUTINES START BY STASHING AWAY THEIR ADDRESSES 
*         IN THE FIT SO THAT SUBSEQUENT GETS AND PUTS JUMP IN RAPIDLY.
*         THIS MACRO DOES THE STORING 
*0D   PARAMETERS
*0        GP - G OR P FOR GET OR PUT
*         BN - A B-REG (NOT B2), CONTAINS LOC UPON EXIT 
*         LOC - FWA OF ACTUAL CODE
*#
 SET.FOJ  MACRO     GP,BN,LOC 
          SB2       =XRM$_GP_1
          S_BN      LOC 
          SX2       BN-B2 
          SET.RM    FOJ_GP,X2,,,TRUNC 
 SET.FOJ  ENDM
          TITLE     STO.REG 
 STO.REG  MACRO     KEEP
          IFNE      "XREG.RM",7,1 
          BX7       X"XREG.RM"
          SA7       A0+"FWRD.RM"
          IFGT      "FWRD.RM",#FTL#+2,1 
          ERR IN STO.REG "FWRD.RM" "SEQUENCE" 
          IFC       EQ, KEEP  ,1
 FWRD.RM  DECMIC    "FWRD.RM"+100B
 STO.REG  ENDM
          TITLE      SAVE     MACRO 
*#
*1CD  SAVE MACRO
*0D   PURPOSE 
*0        SAVE (B6) IN THE RETURN ADDRESS STACK (FET+7).
*0D   CALL
*0                  SAVE
*0D   PARAMETERS
*0        #FETA2#   1 IF (A2) = FET ADDRESS,
*                   0 OR UNDEFINED IF NOT.
*0        A0,A2     FIT, FET ADDRESS. 
*0D   ACTIONS 
*0        PUSHES THE B6 STACK UP ONE ENTRY AND STORES THE CURRENT VALUE 
*         OF B6 IN THE STACK. 
*0D   REGISTERS 
*0        AX17, B6
*0D   OTHER CODE
*0        MACROS-   F.RM
*#
          PURGMAC    SAVE 
 SAVE     MACRO 
 <SAVE>   SET       0 
          SA1       A0+7
          MX7       42
          LX1       18
          BX1       X7*X1 
          SX7       B6
          BX7       X1+X7 
          SA7       A1
 SAVE     ENDM
          TITLE      DEF.RM   MACRO     FLD,DEF,WN,RN 
*#
*1CD  DEF.RM MACRO
*0D   PURPOSE 
*0        SET UP A CALL TO DEF2.RM, WHICH *DEFAULTS* THE VALUE OF A 
*         FIT FIELD TO THE VALUE OF *DEF*.
*0D   CALL
*0        [TAG]     DEF.RM    FLD,DEF,WN,RN 
*0D   PARAMETERS
*0        FLD       NAME OF MICRO DESCRIBING FIELD TO BE *DEFAULTED*. 
*                   WITHOUT THE SURROUNDING # SIGNS.
*0        DEF       DEFAULT VALUE OF FIELD. 
*0        WN        WRITE REGISTER. DEFAULT VALUE IS 7. 
*0        RN        READ REGISTER. DEFAULT VALUE IS 1.
*0D   ACTION
*0        IF #_FLD_# IS NOT A MICRO, AN ASSEMBLY ERROR IS PRODUCED; 
*         ELSE *DEF2.RM* IS CALLED. 
*0D   REGISTERS 
*0        SEE DEF2.RM.
*0D   OTHER CODE
*0        MACROS- DEF2.RM 
*#
 DEF.RM   MACRO     FLD,DEF,WN,RN 
 ?_FLD_'  SET       0 
          IF        -MIC,#_FLD_#,2                                      KEY00390
          ERR       MICRO FLD NOT DEFINED 
          SKIP      1 
          DEF2.RM   DEF,WN,RN,"#_FLD_#"                                 KEY00410
 DEF.RM   ENDM
          TITLE      DEF2.RM  MACRO     DEF,WN,RN,TABL,WRD,FL,POS 
*#
*1CD  DEF2.RM MACRO 
*0D   PURPOSE 
*0        DEFAULT THE VALUE OF A FIT FIELD TO THE VALUE OF *DEF*. 
*0D   CALL
*0        [TAG]     DEF2.RM   DEF,WN,RN,TABL,WRD,FL,POS 
*0D   PARAMETERS
*0        DEF       DEFAULT VALUE OF FIELD. 
*0        WN        WRITE REGISTER (DEFAULT = 7). 
*0        RN        READ  REGISTER (DEFAULT = 1). 
*0        TABL      0 = FIT , 1 = FET.
*0        WRD       WORD WITHIN TABLE, ORDINAL (FIT) OR NUMBER (FET). 
*0        FL        BIT LENGTH OF FIELD.
*0        POS       BEGINNING (LOW-ORDER) BIT POSITION OF FIELD (0-59). 
*0        A0        FIT ADDRESS.
*0D   ACTION
*0        LOAD THE FIT WORD CONTAINING THE SPECIFIED FIELD INTO A.RR. 
*0        IF THE FIT FIELD IS 60 BITS LONG, DEF IS LOADED INTO  X.WN
*         WITH AN  SX.WN INSTRUCTION, AND  X.WN IS STORED BACK INTO 
*         THE FIT (UNLESS THE FIT FIELD WAS ORIGINALLY NON-ZERO), AND 
*         THE MACRO IS EXITED.
*0        IF THE FIT FIELD IS NOT 60 BITS LONG, A MASK OF LENGTH
*         60-FL  IS FORMED IN  X.WN, THE FIT WORD IN  X.RN  IS SHIFTED
*         60-POS(TO RIGHT-JUSTIFY THE FIT FIELD), AND THE OLD VALUE IS
*         RETRIEVED  ( BX.WN   -X.WN*X.RN);  IF THE OLD VALUE IS
*         NON-ZERO, THE MACRO IS EXITED, OTHERWISE  DEF  IS LOADED
*         INTO  X.WN  WITH AN  SX.WN  INSTRUCTION AND THE ORIGINAL FIT
*         WORD IS ORED WITH IT.  THE NEW FIT WORD IS NOW REPOSITIONED 
*         (IF FL IS NON-ZERO) AND THE RESULT STORED BACK INTO THE FIT.
*0        NOTE THAT IN ANY CASE, THE FIELD TO BE DEFAULTED MUST BE
*         ZERO WHEN DEF2.RM IS CALLED.  OTHERWISE, THE MACRO IS EXITED. 
*0D   REGISTERS USED
*0        AX.RN/WN
*0D   OTHER CODE
*0        NONE
*#
 DEF2.RM  MACRO     DEF,WN,RN,TABL,WRD,FL,POS 
          LOCAL     RR,W,EXIT 
 RR       SET       RN 1
 W        SET       WN 7
 RGERR    SET       0 
          IFGT      RR,5,2
          ERR       RN ILLEGAL READ REG 
 RGERR    SET       1 
          IFLT      W,6,2 
          ERR       WN ILLEGAL WRITE REG
 RGERR    SET       1 
 REGERR   IFEQ      RGERR,0 
          SA.RR     A0+WRD
 FL60     IFEQ      FL,60 
*         R=        X.W,DEF                                             FIX03600
          SX.W      DEF                                                 FIX03700
          NZ        X.RR,EXIT 
 FL60     ELSE
          MX.W      60-FL 
          IFNE      POS,0,1 
          LX.RR     60-POS
          BX.W      -X.W*X.RR 
          NZ        X.W,EXIT
*         R=        X.W,DEF                                             FIX03900
          SX.W      DEF                                                 FIX04000
          BX.W      X.RR+X.W
          IFNE      POS,0,1 
          LX.W      POS 
 FL60     ENDIF 
          SA.W      A.RR
 EXIT     BSS       0 
 REGERR   ENDIF 
 DEF2.RM  ENDM
          SPACE     20,40 
 INC/DEC  CLASS    (INC/DEC/BUFFER MACROS)
*#
*1DC  INCREMENT/DECREMENT MACROS
*[    +---------------------------------------------------------------+ 
*X    INCREMENT/DECREMENT MACROS
*0        INCREMENT OR DECREMENT FIT FIELDS OR BUFFER POINTERS. 
*0     ---------------------------------------------------------------
*0D       INC.RM, DEC.RM (IDC.RM) 
*                 INCREMENT/DECREMENT A FIELD IN THE FIT (IN PLACE).
*0D       BUFINC, BUFDEC
*                 CIRCULARLY INCREMENT/DECREMENT A REGISTER THAT
*                 POINTS INTO THE BUFFER. 
*0D       BUFSP 
*                 DETERMINE DISTANCE BETWEEN TWO BUFFER POINTERS. 
*[    +---------------------------------------------------------------+ 
*#
          TITLE      INC.RM   MACRO     FLD,INC,WN,RN 
*#
*1CD  INC.RM MACRO
*0D   PURPOSE 
*0        INCREMENT A VALUE STORED IN A FET/FIT FIELD.
*0D   CALL
*0        [TAG]     INC.RM    FLD,INC,[WN],[RN] 
*0D   PARAMETERS
*0        FLD       NAME (W/O BRACKETING #) OF FIELD. 
*         INC       DIRECT EXPRESSION OR REGISTER GIVING AMOUNT 
*                   BY WHICH THE FIT FIELD IS TO BE INCREMENTED.
*                   NOTE THAT IF INC IS A REGISTER, INC IS ALTERED
*                   BY THE MACRO (THE REGISTER IS SHIFTED LEFT).
*0        WN,RN     WRITE, READ REGISTERS, DEFAULT 7 AND 1 (AX7/1). 
*0D   ACTION
*0        CALLS MACRO IDC.RM TO DO THE WORK.
*0D   REGISTERS 
*0        NONE
*0D   OTHER CODE
*0        MACROS-   IDC.RM
*         PROGRAMS- NONE
*#
 INC.RM   MACRO     FLD,INC,WN,RN 
 '_FLD_?  SET       0 
          IDC.RM    +,INC,WN,RN,,"#_FLD_#"
 INC.RM   ENDM
          TITLE      DEC.RM   MACRO     FLD,DEC,WN,RN,MN
*#
*1CD  DEC.RM MACRO
*0D   PURPOSE 
*0        SET UP A CALL TO *IDC.RM* TO DECREMENT THE VALUE OF AN FIT
*         FIELD.
*0D   CALL
*0        [TAG]     DEC.RM    FLD,DEC,WN,RN,MN
*0D   PARAMETERS
*0        FLD       NAME OF FIELD (W/O # BRACKETS). 
*         DEC       DIRECT EXPRESSION OR REGISTER GIVING AMOUNT 
*                   BY WHICH THE FIT FIELD IS TO BE DECREMENTED.
*                   NOTE THAT IF INC IS A REGISTER, DEC IS ALTERED
*                   BY THE MACRO (THE REGISTER IS SHIFTED LEFT).
*0        WN        WRITE REGISTER (DEFAULT = 7). 
*0        RN        READ  REGISTER (DEFAULT = 1). 
*0        MN        MASK  REGISTER (DEFAULT = 7). 
*0D   ACTION
*0        CALLS MACRO IDC.RM TO DO THE WORK.
*0D   REGISTERS USED
*0        NONE
*0D   OTHER CODE
*0        MACROS-   IDC.RM
*         PROGRAMS- NONE
*#
 DEC.RM   MACRO     FLD,DEC,WN,RN,MN
 '_FLD_?  SET       0 
          IDC.RM    -,DEC,WN,RN,MN,"#_FLD_#"
 DEC.RM   ENDM
          TITLE     IDC.RM    INCREMENT/DECREMENT FIELDS
*#
*1CD  IDC.RM MACRO
*0D   PURPOSE 
*0        INCREMENT OR DECREMENT THE VALUE OF AN FET/FIT FIELD. 
*0D   CALL
*0        [TAG]     IDC.RM    SIGN,INC,W,RR,M,TABL,WRD,FL,POS 
*0D   PARAMETERS
*0        SIGN      + FOR INCREMENT, - FOR DECREMENT. 
*0        INC       AMOUNT TO INCREMENT/DECREMENT BY. 
*0        W         WRITE REGISTER (6 OR 7).
*0        RR        READ REGISTER (1 - 5).
*0        M         MASK REGISTER (DEFAULT = 7).
*0        TABL      0 - FIT, 1 - FET. 
*0        WRD       WORD WITHIN TABLE, ORDINAL (FIT) OR NUMBER (FET). 
*0        FL        BIT LENGTH OF FIELD.
*0        POS       BEGINNING BIT POSITION OF FIELD.
*0D   ACTION
*0        IF THE MICRO FWRD.RM IS EQUAL TO *WRD*, *RR* IS SET TO THE
*         VALUE OF THE MICRO XREG.RM AND NO CODE IS GENERATED TO RE-
*         TRIEVE THE FIELD; A COPY OF IT IS ASSUMED TO BE IN THE X
*         REGISTER GIVEN BY MICRO XREG.RM; ELSE, THE WORD CONTAINING
*         THE FIELD IS FETCHED INTO THE L.O. POSITION OF X.RR.
*0        THEN
*0C       SX.W      INC 
*0        IS GENERATED. IF *SIGN* IS +
*0C       IX.RR     X.RR+X.W
*0        ELSE; 
*0        IX.RR     X.RR-X.W
*0        THE FIELD IS THEN SHIFTED TO ITS NORMAL POSITION IN THE 
*         WORD. NOTE THAT THE INCREMENTED FIELD IS NOT STORED BACK
*         IN THE TABLE. 
*0D   REGISTERS 
*0        AX.W/RR,X.M 
*0D   OTHER CODE
*0        NONE
*#
 IDC.RM   MACRO     SIGN,INC,WN,RN,MN,TABL,WRD,FL,POS 
 RR       SET       RN  1 
 W        SET       WN  7 
 M        SET       MN  7 
 REGERR   IFGT      RR,5,2
          ERR       RN ILLEGAL READ REG 
 REGERR   SKIP
          IFEQ      "FWRD.RM",WRD,1 
 RR       SET       "XREG.RM" 
 REGERR   IFLT      W,6,2 
          ERR       WN ILLEGAL WRITE REG
 REGERR   SKIP
          F.TABL.RM WRD,RR,W
          IF       REG,INC,1
          IFC       LE,/INC/X/,4
          IFC       EQ, INC 1 ,2
          SX.W      B1
          SKIP      1 
          SX.W      INC 
'?RES.RM  SET       RR
          IFEQ      FL,60,1 
'?RES.RM  SET       W 
#.F#      MICRO     1,1, INC
RM.X      IF        REG,INC 
RM.X      IFC       EQ, "#.F#" X
          IFNE      POS,,1
          L_INC     POS 
          IX.'?RES.RM X.RR_SIGN_INC 
RM.X      ELSE
          IFC       EQ, "#.F#" - ,1 
          BX.W      INC 
          IFNE      POS,,1
          LX.W      POS 
          IX.'?RES.RM X.RR_SIGN_X.W 
RM.X      ENDIF 
          IFEQ      FL,60,2 
          SA.W      A.RR
RM.F      SKIP
          IFC       NE, INC 1 ,4
          MX.W      1 
          IFNE      POS+FL,60,1 
          LX.W      POS+FL
          SKIP      1 
          LX.W      FL-1
RM.D      IFC       EQ, SIGN +
          IFEQ      WRD,"FWRD.RM",2 
          BX."XREG.RM" -X.W*X.RR
          SKIP      2 
          BX.W      -X.W*X.RR 
          SA.W      A.RR
RM.D      ELSE
          BX.M      X.RR*X.W
          IFEQ      WRD,"FWRD.RM",2 
          IX."XREG.RM" X.M+X.RR 
          SKIP      2 
          IX.W      X.M+X.RR
          SA.W      A.RR
          ENDIF 
 IDC.RM   ENDM
          TITLE      BUFINC   MACRO     REG,I,J,K 
*#
*1CD  BUFINC MACRO
*0D   PURPOSE 
*0        INCREMENT AN ADDRESS IN THE CIRCULAR BUFFER.
*0    CALL
*0        [TAG]     BUFINC    REG,I,J,K 
*0D   PARAMETERS
*0        REG       X OR B INDICATING WHETHER INPUT REGISTERS *I* AND 
*                   *J* ARE X OR B REGISTERS. 
*0        I         <REG>.I CONTAINS ADDRESS TO BE INCREMENTED. 
*0        J         >REG<.J CONTAINS THE AMOUNT BY WHICH THE INPUT
*                   ADDRESS IS TO BE INCREMENTED. 
*0        K         X REGISTER NUMBER FOR ANSWER. 
*0        A0        FIT ADDRESS.
*0        K NE 1. IF REG=X, I,J NE 1. 
*0D   ACTION
*0        IF *REG* IS B 
*0C       SX.K      B.I+B.J 
*0        IS GENERATED; ELSE
*0C       IX.K      X.I+X.J 
*0        IS GENERATED. 
*0        IF X.K IS THEN GE LIMIT, THE BUFFER SIZE IS SUBTRACTED FROM 
*         IT. 
*0D   REGISTERS 
*0        USES A1,X1, X.K, <REG>.I/J
*0D   OTHER CODE
*0        MACROS-   F.RM
*#
 BUFINC   MACRO     REG,I,J,K                                            GPIOTXT
          LOCAL     BIEXIT                                               GPIOTXT
 REGERR   IFEQ      K,1 
          ERR       RESULT REGISTER = 1 
 REGERR   ELSE
          IFC       EQ,/REG/B/,1                                         GPIOTXT
          SX.K      B.I+B.J                                              GPIOTXT
 XREG     IFC       EQ,/REG/X/
          IX.K      X.I+X.J                                              GPIOTXT
 XREG     ENDIF 
          F.RM      LIMIT,1 
          IX1       X.K-X1                                               GPIOTXT
          NG        X1,BIEXIT                                            GPIOTXT
          F.RM      BFS,1                                                GPIOTXT
          IX.K      X.K-X1                                               GPIOTXT
 BIEXIT   BSS       0                                                    GPIOTXT
 REGERR   ENDIF 
 BUFINC   ENDM                                                           GPIOTXT
          TITLE      BUFDEC   MACRO     REG,I,J,K 
*#
*1CD  BUFDEC MACRO
*0D   PURPOSE 
*0        DECREMENT AN ADDRESS IN THE CIRCULAR BUFFER.
*0D   CALL
*0        [TAG]     BUFDEC    REG,I,J,K 
*0D   PARAMETERS
*0        REG       WHETHER THE INPUT REGISTERS, *I*, *J*, ARE X OR 
*                   B REGISTERS ... X OR B. 
*0        I         <REG>.I CONTAINS THE ADDRESS TO BE DECREMENTED. 
*0        J         <REG>.J CONTAINS THE AMOUNT BY WHICH THE INPUT
*                   ADDRESS TO BE DECREMENTED.
*0        K         X REGISTER NUMBER IN WHICH ANSWER IS RETURNED.
*0        A0        ADDRESS OF FIT. 
*0        K NE 1. IF REG=X, I,J NE 1. 
*0D   ACTION
*0        IF *REG* IS B 
*0C       SX.K      B.I-B.J 
*         IS GENERATED; ELSE
*0C       IX.K      X.I-X.J 
*0        IS GENERATED. 
*0        IF X.K IS NOW LESS THAN THE FIRST WORD ADDRESS OF THE 
*         BUFFER, ADD THE BUFFER SIZE TO IT.
*0D   REGISTERS 
*         USES A1,X1, X.K, <REG>.I/J
*0D   OTHER CODE
*0        MACROS-   F.RM
*#
 BUFDEC   MACRO     REG,I,J,K                                            GPIOTXT
          LOCAL     BDEXIT                                               GPIOTXT
 REGERR   IFEQ      K,1 
          ERR       RESULT REGISTER = 1 
 REGERR   ELSE
          IFC       EQ,/REG/B/,1                                         GPIOTXT
          SX.K      B.I-B.J                                              GPIOTXT
 XREG     IFC       EQ,/REG/X/
          IX.K      X.I-X.J                                              GPIOTXT
 XREG     ENDIF 
          F.RM      FWB,1 
          IX1       X.K-X1                                               GPIOTXT
          PL        X1,BDEXIT                                            GPIOTXT
          F.RM      BFS,1                                                GPIOTXT
          IX.K      X.K+X1                                               GPIOTXT
 BDEXIT   BSS       0                                                    GPIOTXT
 REGERR   ENDIF 
 BUFDEC   ENDM                                                           GPIOTXT
          TITLE      BUFSP    MACRO     P1,P2,P3,P4 
*#
*1CD  BUFSP MACRO 
*0D   PURPOSE 
*         CALCULATE THE AMOUNT OF SPACE IN THE CIRCULAR BUFFER BETWEEN
*         TWO GIVEN ADDRESSES.
*0D   CALL
*0        [TAG]     BUFSP     REG,I,J,K 
*0D   PARAMETERS
*0        REG       X OR B, TO INDICATE WHETHER PARAMETERS *I*, *J* 
*                   ARE X OR B REGISTERS. 
*0        I         <REG>.I CONTAINS THE INITIAL ADDRESS. 
*0        J         <REG>.J CONTAINS THE FINAL ADDRESS. 
*0        K         X.K RETURNS WITH THE ANSWER. K NE 1.
*0        A0        FIT ADDRESS.
*0D   ACTION
*0        IF *REG* IS B,
*0C       SX.K      B.J-B.I 
*0        ELSE, 
*0C       IX.K      X.J-X.I 
*0        IF (<REG>.J) LT (<REG>.I) THEN ADD THE BUFFER SIZE TO THE 
*         THE RESULT IN X.K.
*0D   REGISTERS 
*0        USES      A1,X1, <REG>.I/J, X.K 
*0D   OTHER CODE
*0        MACROS-   F.RM
*#
 BUFSP    MACRO     P1,P2,P3,P4 
          LOCAL     OUT 
 REGERR   IFEQ      P4,1
          ERR       RESULT REG = 1
 REGERR   ELSE
          IFC       EQ,/B/P1/,3 
          SX.P4     B.P3-B.P2 
          GE        B.P3,B.P2,OUT 
          SKIP      2 
          IX.P4     X.P3-X.P2 
          PL        X.P4,OUT
          F.RM      BFS,1 
          IX.P4     X.P4+X.1
 OUT      BSS       0 
 REGERR   ENDIF 
 BUFSP    ENDM
          SPACE     20,40 
 TEST     CLASS    (TEST FIT FIELDS--ON/OFF, IC/KE, BAM/AAM, EQ/NE) 
*#
*1DC  MACROS TO TEST THINGS 
*[    +---------------------------------------------------------------+ 
*X    MACROS TO TEST THINGS 
*0        TEST FIT FIELDS OR REGISTERS. 
*0     ---------------------------------------------------------------
*0D       ON.RM, OFF.RM (OO.RM) 
*                 JUMP BASED ON A ONE BIT FIT FIELD.
*0D       EQ.RM, NE.RM (IFXX.RM)
*                 JUMP BASED ON EQUALITY OF A FIT FIELD TO A SYMBOL.
*0D       ANYOF, NONEOF (XXOF)
*                 JUMP BASED ON A B-REG COMPARED TO A LIST OF SYMBOLS.
*0D       AAM.FO, BAM.FO
*                 JUMP BASED ON FO. 
*0D       CI.SQ, EK.SQ
*                 JUMP BASED ON BT. 
*0D       BOI.RM
*                 JUMP IF FP=BOI. 
*[    +---------------------------------------------------------------+ 
*#
          TITLE     ON.RM 
*#
*1CD  ON.RM MACRO 
*0D   PURPOSE 
*0        CHECK A 1-BIT FIT OR FET FIELD FOR A VALUE OF 1.
*0D   CALL
*0        [TAG]     ON.RM     M,L 
*0D   PARAMETERS
*0        M         FIT OF FET FIELD MNEMONIC (W/O BRACKETING #). 
*0        L         LOCATION TO BRANCH TO IF BIT = 1. 
*0D   ACTION
*0        CALLS MACRO 00.RM TO DO THE WORK.       OO.RM  "#_M_#",NG,L,M 
*0D   REGISTERS USED
*0        NONE
*0D   OTHER CODE
*0        MACROS-   OO.RM 
*         PROGRAMS- NONE
*#
 ON.RM    MACRO     M,L 
          OO.RM     "#_M_#",NG,L,M
 ON.RM    ENDM
          TITLE     OFF.RM
*#
*1CD  OFF.RM MACRO
*0D   PURPOSE 
*0        CHECK A 1-BIT FIT OR FET FIELD FOR A VALUE OF 0.
*0D   CALL
*0        [TAG]     OFF.RM    M,L 
*0D   PARAMETERS
*0        M         FIT OR FET FIELD MNEMONIC (W/O BRACKETING #). 
*0        L         LOCATION TO BRANCH TO IF BIT = 0. 
*0D   ACTION
*0        CALLS MACRO OO.RM TO DO THE WORK.       OO.RM  "#_M_#",PL,L,M 
*0D   REGISTERS USED
*0        NONE
*0D   OTHER CODE
*0        MACROS-   OO.RM 
*         PROGRAMS- NONE
*#
 OFF.RM   MACRO     M,L 
          OO.RM     "#_M_#",PL,L,M
 OFF.RM   ENDM
          TITLE     OO.RM 
*#
*1CD  OO.RM MACRO 
*0D   PURPOSE 
*0        GENERATE JUMP INSTRUCTION FOR MACROS *ON.RM* AND *OFF.RM*.
*0D   CALL
*0        [TAG]     OO.RM     TBL,WRD,LEN,POS,D1,D2,XX,LABEL,FLD
*0D   PARAMETERS
*0        TBL       TABLE CONTAINING SPECIFIED FIELD (0=FIT  1=FET).
*0        WRD       WORD WITHIN TABLE (FROM 0 FIT  FROM 1 FET). 
*0        LEN       LENGTH OF FIELD (NOT USED BY OO.RM).
*0        POS       LOW-ORDER BIT POSITION OF FIELD.
*0        D1        STORE/FETCH FLAG (NOT USED BY OO.RM). 
*0        D2        SYMBOLIC OPTIONS FLAG (NOT USED BY OO.RM).
*0        XX        JUMP INSTRUCTION OP CODE MNEMONIC (NG OR PL). 
*0        LABEL     LOCATION TO JUMP TO IF JUMP IS TAKEN. 
*0        FLD       FIT OR FET FIELD MNEMONIC (W/O BRACKETING #). 
*0        A0        FIT ADDRESS IF FIELD IS IN FIT. 
*0        A1        FET ADDRESS - 1  IF FIELD IS IN FET.
*0        B1        1 IF POS = 58 
*0D   ACTIONS 
*0        IF THE SYMBOL *#DBGCT#* IS DEFINED, CALL MACRO *CT.6RM* TO
*         INCREMENT COUNT OF REFERENCES TO THIS MNEMONIC. 
*0        IF THE MICRO *FWRD.RM* IS NOT EQUAL TO *WRD*, USE THE 
*         COMPASS MACRO *R=*  TO LOAD THE FIT (FET) WORD CONTAING 
*         THE (ON.RM,OFF.RM) SPECIFIED FIELD INTO  X1.
*0        IF THE MICRO *FWRD.RM* EQUALS *WRD*, THE MICRO *XREG.RM*
*         IS THE X-REGISTER CONTAINING THE FIT (FET) WORD WHERE THIS
*         FIELD RESIDES.
*0        NOW, IF *POS* EQUALS 59, THE JUMP INSTRUCTION INDICATED BY
*         PARAMETER *XX* IS GENERATED AND THE MACRO IS EXITED.
*0        IF *POS* EQUALS 58, THE FIT (FET) WORD IS SHIFTED LEFT B1 
*         PLACES, THE JUMP INSTRUCTION INDICATED BY PARAMETER *XX* IS 
*         GENERATED, AND THE MACRO IS EXITED. 
*0        IF *POS* IS NOT 59 OR 58, THE FIT (FET) WORD IS SHIFTED LEFT
*         59-POS PLACES, THE JUMP INSTRUCTION INDICATED BY PARAMETER
*         *XX* IS GENERATED, AND THE MACRO IS EXITED. 
*0        NOTE THAT MACROS ON.RM AND OFF.RM CAN BE USED TO CHECK
*         THE LOW-ORDER BIT OF ANY FIT (FET) FIELD RATHER THAN JUST 
*         1-BIT FIELDS SINCE THE *LEN* PARAMETER IS NOT CHECKED.
*0D   REGISTERS USED
*         X1
*         A1 IF *FWRD.RM* IS NOT EQUAL TO *WRD* 
*         X7 IF *POS* EQUALS 58 
*0D   OTHER CODE
*0        MACROS-   CT.6RM (IF #DBGCT# IS DEFINED)
*         PROGRAMS- NONE
*#
 OO.RM    MACRO     TBL,WRD,LEN,POS,D1,D2,XX,LABEL,FLD
 '_FLD_?  SET       WRD 
          IF        DEF,#DBGCT#,1 
          CT.6RM    ,,FLD 
          IFNE      WRD,"FWRD.RM",3 
          R=        A1,A_TBL+WRD
'?RX1.RM  SET       1 
          SKIP      1 
'?RX1.RM  SET       "XREG.RM" 
          IFEQ      POS,59,2
          XX        X.'?RX1.RM,LABEL
          SKIP
          IFEQ      POS,58,3
          LX7       X.'?RX1.RM,B1 
          XX        X7,LABEL
          SKIP
          IFEQ      WRD,"FWRD.RM",1 
          BX1       X.'?RX1.RM
          LX1       59-POS
          XX        X1,LABEL
          ENDIF 
 OO.RM    ENDM
          TITLE     EQ.RM 
*#
*1CD  EQ.RM, NE.RM MACROS 
*0D   PURPOSE 
*0        JUMP TO A LABEL IF A FIT FIELD IS EQUAL TO A SYMBOLOC VALUE.
*0D   CALL
*0        [TAG]     EQ.RM     FIELD,VALUE,LABEL,BTEMP,LOAD,MASK 
*         [TAG]     NE.RM     FIELD,VALUE,LABEL,BTEMP,LOAD,MASK 
*0D   PARAMETERS
*0        FIELD     FIT FIELD NAME
*0        VALUE     SYMBOL (SUPERIOR CODE IS GENERATED WHEN THE VALUE IS
*                      EQUAL TO 0 OR 1, E.G. #IT#, #WT#)
*0        LABEL     PLACE TO JUMP TO IF FIELD IS EQ/NE VALUE. 
*0        BTEMP     A SCRATCH B-REG.
*0        LOAD,MASK  OPTIONAL SCRATCH X-REGS. 
*#
 EQ.RM    MACRO     FIELD,VALUE,LABEL,BTEMP,LOAD,MASK 
          IFXX.RM   FIELD,VALUE,LABEL,BTEMP,LOAD,MASK,ZR,EQ 
 EQ.RM    ENDM
          TITLE     NE.RM 
 NE.RM    MACRO     FIELD,VALUE,LABEL,BTEMP,LOAD,MASK 
          IFXX.RM   FIELD,VALUE,LABEL,BTEMP,LOAD,MASK,NZ,NE 
 NE.RM    ENDM
          TITLE     IFXX.RM 
 IFXX.RM  MACRO     FIELD,VALUE,LABEL,BTEMP,LOAD,MASK,TESTX,TESTB 
 '?RX1.RM SET       LOAD 1
 .Z       IFEQ      VALUE 
          F.RM      FIELD,LOAD,X.'?RX1.RM,,MASK 
          TESTX     X.'?RX1.RM,LABEL
 .THRU    SKIP
 .Z       ENDIF 
 .O       IFEQ      VALUE,1 
          F.RM      FIELD,LOAD,BTEMP,,MASK
          TESTB     BTEMP,B1,LABEL  "SEQUENCE" B.TEMP REQUIRED
 .O       ELSE
          F.RM      FIELD,LOAD,BTEMP,-VALUE,MASK
          TESTB     BTEMP,B0,LABEL "SEQUENCE" B.TEMP REQUIRED 
          ENDIF 
 IFXX.RM  ENDM
          TITLE     XXOF
*#
*0DC  NONEOF AND ANYOF
*0D   PURPOSE 
*0        TEST A B-REG FOR ANY OF A SET OF VALUES.
*0D   CALL
*0               ANYOF     BN,(<LIST-OF-SYMBOLIC-VALUES>),LABEL 
*                NONEOF    BN,(<LIST-OF-SYMBOLIC-VALUES>),LABEL 
*#
 XXOF     MACRO     BN,LIST 
          LOCAL     M 
 M        SET 
          IRP       LIST
 #.S#     DECMIC    LIST
 M        SET       M+1S"#.S#"
          IRP 
          R=        X7,M
          AX7       BN
          LX7       59
 XXOF     ENDM
          TITLE     NONEOF
 NONEOF   MACRO     BN,LIST,LABEL 
          XXOF      BN,(LIST) 
          PL        X7,LABEL
 NONEOF   ENDM
          TITLE     ANYOF 
 ANYOF    MACRO     BN,LIST,LABEL 
          XXOF      BN,(LIST) 
          NG        X7,LABEL
 ANYOF    ENDM
          TITLE     AAM.FO
*#
*1CD  AAM.FO MACRO
*0D   PURPOSE 
*0        GENERATE CODE TO TAKE A JUMP IF FO"IS,DA,AK.
*0D   CALL
*0        [TAG]     AAM.FO    LL
*0D   PARAMETERS
*0        LL        LOCATION TO JUMP TO IF FO"IS,DA,AK
*0D   ACTION
*0        JUMP TO THE LABEL IF FO INDICATES ADVANCED ACCESS.
*0D   REGISTERS USED
*0        AX1,X7,B2 
*0D   OTHER CODE REQUIRED 
*0        MACROS-   F.RM
*         PROGRAMS- NONE
*#
 A        MAX       #SQ#,#WA# 
          IFGE      A,2,1 
          ERR       FO CODES CHANGED - FIX AAM.FO MACRO 
          CKMICRO   FO,(,,-1,+1),AAM
  
 AAM.FO   MACRO     LL,BN 
          IFC       NE, BN
          GT        BN,B1,LL
          ELSE
          F.RM      AAM 
          NZ        X1,LL 
          ENDIF 
 AAM.FO   ENDM
          TITLE     BAM.FO
 BAM.FO   MACRO     LL,BN 
          IFC       NE, BN
          LE        BN,B1,LL
          ELSE
          F.RM      AAM 
          ZR        X1,LL 
          ENDIF 
 BAM.FO   ENDM
          TITLE     BOI.RM MACRO
 BOI.RM   MACRO     ADR 
 SYS      IFC       EQ,/"OS.NAME"/KRONOS/ 
          F.RM      FCS            GET FUNCTION CODE
          MX6       58             IGNORE MODE AND COMPLETE BITS
          BX1       X6*X1 
          SX6       50B 
          BX1       X1-X6 
          SB4       #BOI# 
          ZR        X1,ADR         JUMP IF BOI HIT
 SYS      ELSE
          F.RM      RSC,2          RESIDUAL SKIP COUNT
          SET.RM    RSC,0 
          SB4       #BOI# 
          NZ        X2,ADR         JUMP IF BOI HIT
 SYS      ENDIF 
 BOI.RM   ENDM
          TITLE     CI.SQ 
 CI.SQ    MACRO     LL
          OFF.RM    EK,LL 
 CI.SQ    ENDM
          TITLE     EK.SQ 
*#
*1CD  EK.SQ MACRO 
*0D   PURPOSE 
*0        GENERATE CODE TO TAKE A JUMP IF BT=K/E. 
*0D   CALL
*0        [TAG]     EK.SQ     LL
*0D   PARAMETERS
*0        LL        LOCATION TO JUMP TO IFF. BT=K/E.
*0D   ACTION
*0        PRODUCES AN ASSEMBLY ERROR IF #IT# ^LT #KT# OR
*         #CT# ^LT #KT# OR #KT# ^LT #ET#. 
*0        GENERATES 
*0                            F.RM      LT,X1,-#KT# 
*                             PL        X1,LL 
*0D   REGISTERS 
*         AX1, X7.
*0D   OTHER CODE
*0        MACROS-   F.RM
*#
 EK.SQ    MACRO     LL
          ON.RM     EK,LL 
 EK.SQ    ENDM
          SPACE     20,40 
 PASSLOC  CLASS    (PASSLOC AND OTHER FDL STUFF)
*#
*1DC  LOAD/CMM/FDL, ETC. MACROS 
*[    +---------------------------------------------------------------+ 
*X    LOAD/CMM/FDL, ETC. MACROS 
*0        HANDLE VARIOUS THINGS HAVING TO DO WITH DYNAMIC LOADING.
*0     ---------------------------------------------------------------
*0D       PLL, PLX, PLY, PLOC 
*                 CREATE AN ENTRY IN A PASSLOC TABLE. 
*0D       FAKEPL
*                 CREATE SOMETHING THAT LOOKS LIKE A PASSLOC ENTRY. 
*0D       CAP.RM
*                 CREATE THE ENTRY LINE OF AN FO ROUTINE. 
*0D       ENTRY$
*                 CREATE THE ENTRY LINE OF AN RM ENTRY POINT. 
*0D       LOAD.BAM, LGO.RM
*                 LOAD A CAPSULE. 
*0D       RJU 
*                 RJ, BUT WITH TRACK TURNED OFF.
*0D       UNL 
*                   GENERATE UNL SUBROUTINE.
*[    +---------------------------------------------------------------+ 
*#
  
 #PLAO#   EQU       0              OFFSET OF ADDRESS IN ENTRY TABLE 
          TITLE     PLOC
          MACRO     PLOC,XXX
          EXT       RM$PL 
 '?OFF.RM SET       1 
 PLOC     ENDM
          TITLE     PLY 
          MACRO     PLY,NAME
          IFC       NE, NAME  ,1
 NAME     EQU       RM$PL+'?OFF.RM
 '?OFF.RM SET       '?OFF.RM+1+#PLAO# 
 PLY      ENDM
          TITLE     PLX 
 PLX      OPSYN     PLY 
          TITLE     PLL 
 PLL      OPSYN     PLY 
          TITLE     FAKEPL
 FAKEPL   MACRO     CAP 
 .PL      MICRO     3,, CAP 
          VFD       42/0L".PL",18/CAP 
 FAKEPL   ENDM
          TITLE     ENTRY$
*#
*1CD  ENTRY$ MACRO
*0D   PURPOSE AND RESTRICTION 
*0        ONLY RM ENTRIES (FROM CRMTEXT) USE ENTRY$ FOR AN ENTRY LINE 
*0D   PARAMETERS, ACTION
*0        PARAM     DEFAULT   OPTION    ACTION
*         1         BSS 0     RJ        BSS 1 
*         2         ENTRY XX  NOENTRY   - 
*         3         PUT.IN    NOLOAD    - 
*         THE PUT.IN REFERS TO LOADING X5 WITH THE FIT WORD CONTAINING
*         FNF,OC,PD,OC,CNF,BFS,RSI,WSI. 
*#
          MACRO     ENTRY$,NAME,FRJ,FNE,FNL 
          IFC       NE, FNE NOENTRY ,1
          ENTRY     NAME
 NAME     BSS 
          IFC       EQ, FRJ RJ ,1 
          EQ        *+1S17
          IFC       EQ, FNL NOLOAD ,2 
 21B      IS.IN     5 
          SKIP      1 
 21B      PUT.IN    5 
 ENTRY$   ENDM
          TITLE     LOAD.BAM  PL,FOS
*#
*0D   LOAD.BAM, LGO.RM
*0D   PURPOSE 
*0        LOAD A BAM/AAM CAPSULE. 
*0D   PARAMETERS
*         1.  LOCATION OF PASSLOC ENTRY 
*         LGO.RM ONLY:  
*0        2.  WHICH FILE ORGANIZATIONS ARE LEGAL (NULL MEANS DO NOT 
*         TEST).
*         3.  (OPTIONAL) GO MEANS JUMP TO CAPSULE.
*0D   CALLS 
*0        RM$LGO,  RM$BLD 
*#
 LOAD.BAM SPACE     4,8 
 LOAD.BAM MACRO     PL,FOS
          IF        REG,PL,1
          IFNE      PL,A2,1 
          SA2       PL+#PLAO# 
          IFC       NE, FOS  ,1 
          ERR FOS NOT LEGAL ON LOAD.BAM "SEQUENCE"
          RJ        =YRM$BLD
 LOAD.BAM ENDM
  
 FO=SQ    EQU       1 
 FO=AAM   EQU       150B
 FO=NOTWA EQU       FO=SQ+FO=AAM
 FO=ANY   EQU       FO=NOTWA+2B 
          TITLE     LGO.RM
 LGO.RM   MACRO     PL,FOS
          IFC       EQ, FOS  ,2 
          BX3       0 
          SKIP      3 
          R=        X3,FOS
          IFC       NE, "FWRD.RM""XREG.RM" 21B5 ,1
          ERR NEED 21B PUT.IN 5 "SEQUENCE"
          IFC       NE, PL A2 ,1
          SA2       PL+#PLAO# 
          EQ        =YRM$LGO
 LGO.RM   ENDM
          TITLE     CAP.RM
*#
*1CD  CAP.RM MACRO
*0D   PURPOSE 
*0        GENERATE CAPSULE STATISTICS CODE FOR EACH CAPSULE 
*0D   CALL
*0        [TAG]     CAP.RM    [TRANS],[NOENTRY] 
*0D   PARAMETERS
*0        TAG       USED IN BUILDING CAPSTAT WORD.
*0        TRANS     ONE OF
*                      PERMANENT
*                      INTERMEDIATE 
*                      TRANSIENT
*0        NOENTRY   IF SPECIFIED, DELETES ENTRY STATEMENT 
*0D   ACTION
*0        IF NOT ALREADY DEFINED, GENERATE A WORD LABELED -CAPSTAT- 
*         CONTAINING THE CAPSULE NAME IN THE UPPER 42 BITS AND  1  IN 
*         THE LOWER 18 BITS.  THE  1  IS A REFERENCE COUNT THAT 
*         INDICATES STATIC LOADING. 
*         IF CAPSTAT IS ALREADY DEFINED, GENERATE A NEGATIVE WORD THAT
*         POINTS TO CAPSTAT.
*         BITS 0-18 INDICATE THE
*         NUMBER OF OPEN FILES USING THIS CAPSULE.
*         THIS COUNT IS OFF BY 1 IF THE CAPSULE IS STATICALLY LOADED
*         (SEE RM$LDC), THEREFORE THE COUNT CANNOT GO TO ZERO.
*0        THEN TRANS PARAMETER HELPS CONTROL THE UNLOADING OF THE 
*         CAPSULE --
*            PERMANENT - NO CODE HERE; REF COUNT AND CLSF$RM CO WORK. 
*            INTERMEDIATE - REMEMBER WHETHER DYNAMIC BUT WAIT UNTIL 
*                   LATER TO CALL THE CAPSULE TRANSIENT .  EXAMPLES:  
*                   OPEN/CLSF LOAD LBUF,  REW UNLOADS PUT.
*            TRANSIENT - IMMEDIATELY ANNOUNCE THAT THE CAPSULE MAY BE 
*                   UNLOADED.  THIS ASSUMES THAT NOTHING WILL HAPPEN
*                   DURING THE EXECUTION OF THE CAPSULE TO BUMP OUT THE 
*                   CAPSULE.
*0D   REGISTERS USED
*0        NONE
*0D   OTHER CODE REQUIRED 
*0        NONE
*#
          MACRO     CAP.RM,NTRY,TRANS,NOENTRY 
          IF        -DEF,CAPSTAT
*         MAKE AN ARROW IN DMP POINT TO CAPSTAT 
          IF        DEF,#DEV#,1 
          CON       -0,-0 
 CAPSTAT  VFD       42D/0L_NTRY,18D/1 
          ELSE      1 
+         VFD       42D/-0,18D/CAPSTAT
          IFC       NE, NTRY
          TITLE     NTRY CAPSULE
          IFC       EQ, NOENTRY  ,1 
          ENTRY     NTRY
 NTRY     BSS 
          ENDIF 
 #.C#     MICRO     1,6, CAP.TRANS
          IF        -MIC,"#.C#" 
          SA6       =XRM$TMP
          ELSE
          ECHO      2,C=("#.C#")
          IFC       NE, "C"  ,1 
          "C" 
          ENDIF 
 CAP.RM   ENDM
  
 CAP.IN   MICRO     1,,/CAP.IN/ 
 CAP.IN   MACRO 
          SX7       0 
          SA6       CAPSTAT 
          SA7       =XRM$TMP
 CAP.IN   ENDM
 CAP.PE   MICRO 
 CAP.     MICRO 
          TITLE     RJU 
 RJU      MACRO     CMM 
          LOCAL     A,B 
          IF        DEF,#DEV#,1 
          SB0       B1+A
          RJ        CMM 
          IF        DEF,#DEV# 
          EQ        B 
 A        RJ        =YUNTRACK 
          RJ        CMM 
          RJ        =YTRACK 
          CON       0LASIS,-0 
 B        BSS 
          ENDIF 
 RJU      ENDM
          TITLE     UNL 
*#
*1CD  UNL 
*0D   PURPOSE 
*0        GENERATE THE UNL SUBROUTINE.
*         UNL DECREMENTS THE REF COUNT OF A CAPSULE AND MAY UNLOAD IT.
*0D   CALL (OF THE SUBROUTINE.) 
*                   X6 = ADDR OF ENTRY POINT TO UNLOAD
*                   B2 = ADDR OF GROUP NAME 
*                   RJ    UNL 
*#
 UNL      MACRO 
 UNL2     BSS 
          SX1       B2
          BX7       X7+X1          CAP NAME + PTR TO GROUP NAME 
          SA7       =XRM$TMP
          RJ        =XRM$UTC       UNLOAD IT IF COUNT=0 
          SB4       B0
 UNL
          NG        X6,UNL         JUST IN CASE FUNNY STAT/DYN COMBO
          SA3       X6-1
          PL        X3,UNL1 
          SA3       X3
 UNL1     MX4       -1
          IX7       X3+X4          DECREMENT REFERENCE COUNT BY 1 
          SB4       X7
          SA7       A3
          GT        B4,B0,UNL      IF CAPSULE STILL IN USE
          EQ        UNL2
 UNL      ENDM
          SPACE     20,40 
 SYSY     CLASS    (I/O -- SYSY, RCL, CLCD) 
*#
*1DC  I/O MACROS
*[    +---------------------------------------------------------------+ 
*X    I/O MACROS
*0        PERFORM RA+1 REQUESTS.
*0     ---------------------------------------------------------------
*0D       CLCD.SQ 
*                 CLEAR CODE AND STATUS IN FET. 
*0D       RCL.RM
*                 ISSUE A  RCL  REQUEST (VARIOUS FLAVORS).
*0D       SYSY
*                 ISSUE A  CIO  REQUEST.
*[    +---------------------------------------------------------------+ 
*#
          TITLE     CLCD.SQ 
*#
*1CD  CLCD.SQ MACRO 
*0D   PURPOSE 
*0        SET FET CODE/STATUS BITS TO A SPECIFIED CODE
*0D   CALL
*0        [TAG]     CLCD.SQ   CODE
*0D   PARAMETERS
*0        CODE      VALUE TO STORE IN FET WORD 0 BITS 0-17. 
*0D   ACTION
*0        LOAD FET ADDRESS INTO  A2  AND ITS CONTENTS INTO  X2
*         ZERO OUT BITS 0,2-17 USING *FETMASK* (DEFINED BY ROUTINE
*         CIO.RM IN COMMON BLOCK  /CON.RM/), THEN  OR  IN THE VALUE 
*         CODE+1 (TO SET THE COMPLETE BIT) AND STORE THE RESULT BACK
*         INTO THE FET. 
*0D   REGISTERS USED
*0        AX127 
*0D   OTHER CODE
*0        MACROS-   F.RM (IF #FETA2# = 0) 
*0        PROGRAMS- NONE
*#
 CLCD.SQ  MACRO     CODE
          SA1       A0
          SX7       400001B 
          LX7       1 
          BX7       X7*X1 
          R=        X1,CODE+1 
          BX7       X7+X1 
          SA7       A0
 CLCD.SQ  ENDM
 #SYS#    IFC       EQ,/"OS.NAME"/KRONOS/ 
          TITLE     FILINFO 
          PURGMAC   FILINFO 
 FILINFO  MACRO     ADDR
          SYSTEM    LFM,RECALL,ADDR,3200B 
 FILINFO  ENDM
 #SYS#    ENDIF 
          TITLE    RCL.RM  MACRO   Q,P
*#
*1DC  RCL.RM MACRO
*0D   PURPOSE 
*0        ISSUE ALL RECALL REQUESTS 
*0D   CALL
*0        [TAG]     RCL.RM    ARG1,ARG2 
*0D   PARAMETERS
*0        ARG1      FET ADDRESS IF ARG2=A OR ARG2=P (REGISTER OR ADR).
*                   COUNT IF ARG2=C   WHERE  ARG1/4 = MSECS IN RECALL.
*0        ARG2      TYPE OF RECALL DESIRED IS INDICATED BY THE FIRST
*                   CHARACTER.
*                       A = AUTO-RECALL 
*                       P = PERIODIC RECALL 
*                       C = COUNT RECALL
* 
*0D   ACTION
*0        LOAD FIRST ARGUMENT INTO X7. IF TYPE OF RECALL IS COUNT AND 
*         THE SPECIFIED COUNT IS POSITIVE, COMPLEMENT X7. PUT 
*         THE RETURN ADDRESS IN B5.  IF THE TYPE OF RECALL IS AUTO, 
*         EQ  TO *RM.RCLA*.  OTHERWISE  EQ  TO *RM.RCLP*. 
*0        IN ESSENCE, WHEN WE WANT AUTO-RECALL, WE CALL RM.RCLA  WITH 
*         FET ADDRESS IN X7. WHEN WE WANT PERIODIC RECALL, WE CALL
*0        NOTE-     WHEN SPECIFYING COUNT RECALL AS AN ABSOLUTE NUMBER
*                   YOU CAN SAVE 15 BITS OF GENERATED CODE BY MAKING
*                   IT NEGATIVE IN VALUE. 
*0        EXAMPLES- 
*                     * * * * AUTO-RECALL * * * * 
*                   RCL.RM    B6,AUTO             B6=FET ADR/STATUS WORD
*                   RCL.RM    ERRFET,A
*                   RCL.RM    A2,AUTORECALL 
*                     * * * * PERIODIC RECALL * * * * 
*                   RCL.RM    B6,PERIODIC 
*                   RCL.RM    ERRFET,P
*                   RCL.RM    A2,P
*                     * * * * COUNT RECALL * * * *
*                   RCL.RM    -60,COUNT           RECALL FOR 15 MSECS 
*                   RCL.RM    -200,C              RECALL FOR 50 MSECS 
*                   RCL.RM    60,COUNT            +60=15 EXTRA BITS 
*                   RCL.RM    -0,COUNT            SYSTEM DEFAULT RECALL 
*                   RCL.RM    X3,COUNT            COUNT IS IN X3
*                   RCL.RM    B5,C                COUNT IS IN B5
*0D   REGISTERS USED
*0        X7
*0D   OTHER CODE REQUIRED 
*0        MACROS-   NONE
*         PROGRAMS- CIO.RM
*#
 RCL.RM   MACRO     Q,P 
 P1       MICRO     1,1,$P$ 
*          Q MAY BE AN ADRESS,ANY REGISTER,AN INTEGER 
 .A       IFC       EQ, "P1" A
          R=        X7,Q
          RJ        =XRM$RCLA 
 .A       ELSE
          SX7       3LRCL 
          IFC       NE,/"OS.NAME"/KRONOS/,2 
          IFC       EQ, "P1" C ,1 
          R=        X1,Q
          LX7       42
 .C       IFC       NE,/"OS.NAME"/KRONOS/ 
 .C       IFC       EQ, "P1" C
          IFC       GE, Q - ,2
          BX7       -X1+X7
          SKIP      1 
          BX7       X7+X1 
 .C       ENDIF 
          RJ        =XRM$SYS= 
 .A       ENDIF 
 RCL.RM   ENDM
          TITLE  SYSY  MACRO  FCODE,RCL,SKPCNT,LEVL 
*#
*1CD  SYSY MACRO
*0D   PURPOSE 
*0        ISSUE A CIO CALL
*0D   CALL
*0        [TAG]     SYSY      FCODE,[RCL],[SKPCNT],[LEVL] 
*0D   PARAMETERS
*0        FCODE     CIO FUNCTION CODE.
*0        RCL       IF NON-NULL, CIO CALL IS ISSUED WITH AUTO-RECALL. 
*0        SKPCNT    REGISTER NUMBER (CANNOT BE 1,2,7) USUALLY CONTAINING
*                   A SKIP COUNT. (X.SKPCNT) WILL BE PLACED IN BITS 
*                   18-35 OF THE RA+1 WORD. 
*0        LEVL      REGISTER NUMBER (CANNOT BE 1,2,7) CONTAINING
*                   THE RECORD LEVEL NUMBER.  X.LEVL WILL BE
*                   PLACED IN BITS 14-17 OF FET CODE+STATUS.
*0        B1        1.
*         A2        FET ADDRESS.
*0D   ACTION
*0        IF *RCL* PARAMETER WAS NOT SPECIFIED, 
*                   PUT *FCODE* IN X2 USING R= PSEUDO-OP, 
*                   OR X.SKPCNT INTO X2 BITS 18-35 (IF SPECIFIED),
*                   OR X.LEVEL INTO X2 BITS 14-17 (IF SPECIFIED). 
*0        IF *RCL* PARAMETER IS SPECIFIED,
*         THEN RJ TO *RM$CIO*.
*                   PUT NEGATIVE *FCODE* IN X2, 
*                   AND THE NEGATIVE OF X.SKPCNT INTO X2 BITS 18-35 (IF 
*                       SPECIFIED), 
*                   AND THE NEGATIVE OF X.LEVL INTO X2 BITS 14-17 (IF 
*                       SPECIFIED). 
*         THEN RJ TO =YRM$CIO.
*0D   REGISTERS USED
*0        X2
*0D   OTHER CODE REQUIRED 
*0        MACROS-   NONE
*         PROGRAMS- RM.CIO
*#
 SYSY     MACRO     FCODE,RECALL,SKPCNT,LEVL
 .1       IFC       EQ,*RECALL**
          R=        X2,FCODE
          IFC       NE,*SKPCNT**,2
          LX.SKPCNT 18D 
          BX2       X.SKPCNT+X2 
          IFC       NE,*LEVL**,2
          LX.LEVL   14D 
          BX2       X.LEVL+X2 
 .1       ELSE
 .Q       MICRO     1,1,*FCODE* 
 .2       IFC       EQ,*".Q"*X* 
          BX2       -FCODE
 .2       ELSE
          SX2       -FCODE
 .2       ENDIF 
          IFC       NE,*SKPCNT**,2
          LX.SKPCNT 18D 
          BX2       -X.SKPCNT*X2
          IFC       NE,*LEVL**,2
          LX.LEVL   14D 
          BX2       -X.LEVL*X2
 .1       ENDIF 
* AUTO-RECALL BETTER NOT DESTROY X2 
          RJ        =YRM$CIO
 SYSY     ENDM
          SPACE     20,40 
 MISC     CLASS    (MISCELLANEOUS)
*#
*1DC  MISCELLANEOUS MACROS
*[    +---------------------------------------------------------------+ 
*X    MISCELLANEOUS MACROS
*0        VARIOUS ODDS AND ENDS.
*0     ---------------------------------------------------------------
*0D       CRMEI, CRMEP
*                 SET UP AND ISSUE AN ERROR MESSAGE (MESSAGE IN 
*                 REGISTER) 
*0D       EPX6 (DMP.ERR)
*                 SET UP AND ISSUE AN ERROR MESSAGE (MESSAGE IN 
*                 CURRENT BLOCK)
*0D       KNT.EQU 
*                 INCREMENT KNT.IT BY 1, THEN EQUATE WITH SYMBOL
*0D       CLSV$SQ 
*                 LOAD AND CALL UNSOLICITED CLOSE VOLUME. 
*0D       CT.6RM (SETS.6RM, SETT.6RM) 
*                 A TOOL FOR DYNAMICALLY COUNTING REFERENCES TO FIT 
*                 FIELDS. 
*0D       GET1.SQ 
*                 GET ROOM FOR ONE WORD IN THE BUFFER (FOR PUT.SQ). 
*0D       PRTY.SQ 
*                 COMPUTE PARITY BIT (FOR CONTROL WORDS). 
*[    +---------------------------------------------------------------+ 
*#
          TITLE     CRMEP 
*#
*1CD  CRMEP MACRO 
*0D   PURPOSE 
*0        CALL COMMON ERROR PROCESSOR TO PERFORM NOTE OR ERROR
*         PROCESSING. 
*0D   CALL
*0        [TAG]    CRMEP     <KEYWORD1>=<VALUE1>[,<KEYWORDN>=<VALUEN>]..
*0D   PARAMETERS
*0        FIT      FIT ADDRESS (A0 DEFAULT) 
*         ES       NOTE OR ERROR CODE IN OCTAL (NOTES\1000B)
*         FNF      1=        FATAL ERROR (DEFAULT=0)
*         INA      LOCATION OF MESSAGE INSERT LIST (OPTIONAL) 
*         EES      1=        SUPPRESS ERROR EXIT PROCESSING. (DEFAULT=0)
*         DME      1=        SOURCE OF CALL IS NOT CRM.  (DEFAULT=0)
*         IFOP               TEST INSTRUCTION ENCLOSED IN PARENTHESIS 
*                            WITH TARGET ADDRESS ABSENT.  TRUE RESULT 
*                            CALLS ERROR PROCESSOR, ELSE FALL THROUGH.
*         SES                PARITY ERROR SEVERITY. 
*0D   ACTION
*0        ALL PARAMETERS EXCEPT FIT ADDRESS, MESSAGE INSERT LIST ADDRESS
*         AND RETURN ADDRESS ARE PACKED INTO THE LOWER 18 BITS OF X6. 
*         IF THE IFOP PARAMETER IS PRESENT ERR$RM IS CALLED ON TRUE 
*         CONDITION.  ELSE ERR$RM IS UNCONDITIONALLY ENTERED.  ON NOTES 
*         AND ON ERRORS WHERE EES=1 THE RETURN ADDRESS WILL BE PASSED 
*         IN X5.  IF INA IS SPECIFIED THE MESSAGE INSERT LIST WILL BE 
*         PASSED IN B3.  A CALL WITH ES ZERO OR ABSENT WILL INVOKE ERROR
*         EXIT PROCESSING AND/OR RETURN TO CRM USER.  A CALL WITH EES=1 
*         WILL RESULT IN EES IN FIT BEING SET TO INDICATE ERROR 
*         POSTED BUT EXIT NOT TAKEN.  SUBSEQUENT ERROR EXIT PROCESSING
*         WILL CLEAR THE BIT. 
*0D   REGISTERS 
*0        DESTROYED-
*                  X6        ALWAYS 
*                  X5        WHEN IFOP FALL THROUGH AND EES=1 OR NOTE.
*                  B3        WHEN IFOP FALL THROUGH AND INA"0 
*                  ALL       EXCEPT IFOP FALL THROUGH AS DESCRIBED ABOVE
*0        PRESERVED-
*                  A0,B1
*0D   OTHER CODE REQUIRED 
*0        MACROS-            NONE 
*         PROGRAMS-          ERR$RM,DF$CRM,EF$CRM 
*#
 CRMEP    MACROE    FIT,ES,FNF,INA,EES,DME,IFOP,SES 
          LOCAL     RTRN,NTE,INF,ER,SUM 
          R=        B1,1
          IFC       NE,/FIT//,1 
          SA0       FIT 
 #.R#     MICRO     1,, X6
          IFC       EQ,/ES//,2
          BX6       0              JUST JUMP TO EX
 .A       SKIP
 NTE      SET       ES/1000B
 ER       SET       ES-1000B*NTE
 INF      SET       0 
          IFC       NE,/INA//,3 
 INF      SET       1 
          SB3       INA 
 #.R#     MICRO     1,, "#.R#",B3 
 SUM      SET       0 
          ECHO      ,PA=(FNF,NTE,DME,INF,EES,SES,ER),PS=(17,16,15,14,13,
,9,0),MX=(1,1,1,1,1,17B,777B) 
          ERRMI     MX-PA 
 SUM      SET       SUM+1S_PS*PA
          ENDD
          SX6       SUM 
          IFEQ      NTE,0,1 
          IFC       NE,/EES//,2 
 #.R#     MICRO     1,, "#.R#",X5 
          SX5       RTRN
 .A       ENDIF 
          IFC       EQ,/IFOP//,2
          EQ        =XERR$RM
          SKIP
          IFOP,=XERR$RM 
 #.I#     MICRO     4,,/IFOP/ 
          ECHO      ,A=("#.I#") 
          ECHO      ,B=("#.R#") 
          IFEQ      A,B,1 
          ERR REG CONFLICT "#.R#" IFOP "SEQUENCE" (CRMEP CALL)
          ENDD
          ENDIF 
          IFC       NE,/ES//,3
          IFEQ      NTE,0,1 
          IFC       NE,/EES//,1 
 RTRN     BSS       0 
 CRMEP    ENDM
          SPACE     3 
*#
*1CD  EPX6 MACRO
*0D   PURPOSE 
*0        SET UP A DIAGNOSTIC OR ERROR MESSAGE IN THE CURRENT BLOCK 
*0D   CALL
*0        [TAG]    EPX6    <KEYWORD1>=<VALUE1>[,...,<KEYWORDN>=<VALUEN>]
*0D   PARAMETERS
*0        SYM     NAME OF ERROR PROCESSING INTERFACE TABLE ORDINAL
*         FNF    1=FATAL ERROR
*         NTE    1=INFORMATIVE MESSAGE
*         DME    1=SOURCE OF CALL IS NOT CRM
*         INF    1=AUXILIARY TEXT MUST BE INSERTED
*         EES    1=SUPPRESS ERROR EXIT PROCESSING 
*         SES    PARITY ERROR SEVERITY
*         SES    PARITY ERROR SEVERITY
*         ES     NOTE OR ERROR CODE IN OCTAL (NOTES>777B) 
*         RET    1=CONTROL SHOULD BE RETURNED TO CALLING PROGRAM
*         KEY    1="THE KEY IS <N>" INFORMATIVE MESSAGE 
* 
*         DEFAULT FOR PARAMETERS IS ZERO. 
*0D   ACTION
*0D       T.ORD IS DEFINED TO BE 1 THE FIRST TIME EPX6 IS CALLED AND IS 
*         INCREMENTED BY 1 EACH TIME EPX6 IS SUBSEQUENTLY CALLED. 
*0        IF SYM"T.ORD ON ANY CALL TO EPX6, TAKE ERROR EXIT,
*         ELSE CONTINUE:  
*0                MODIFY SYM TO THE VALUE OF ES (QUALIFIER *ERRORS* IS
*                 IN EFFECT FOR THIS DEFINITION). 
*0                FOR EACH MESSAGE FIELD, INITIALIZE THE FIELD WITH THE 
*                 APPROPRIATE PARAMETER VALUE (SEE THE ECHO) USING VFD
*                 PSEUDO OPS. ALSO, ON FIRST CALL, DEFINE <PARAMETER>.P 
*                 AS THE MESSAGE'S POSITION IN THE CURRENT BLOCK. 
*0D   REGISTERS USED
*                 NONE
*0D   OTHER CODE REQUIRED 
*0                NONE
*#
          TITLE     EPX6
          MACROE    EPX6,SYM,FNF,NTE,DME,INF,EES,SES,ES,RET,KEY 
          LOCAL     L 
          IF        -DEF,T.ORD,3
 T.ORD    SET       1 
          NOREF     T.ORD 
          SKIP      1 
 T.ORD    SET       T.ORD+1 
          IFNE      SYM,T.ORD,2 
          ERR       SYMBOL/ORDINAL SEQUENCE ERROR ("SEQUENCE")
          SKIP      21D 
          QUAL      ERRORS
 SYM      SET       ES
          QUAL      * 
 L        SET       0 
 MSY.M    MICRO     1,,/PRET,PKEY,P,PSYM,P,PFNF,PNTE,PDME,PINF,PEES,PSES
,,PES/
 PAR.M    MICRO     1,,/RET,KEY,,SYM,,FNF,NTE,DME,INF,EES,SES,ES/ 
 POS.M    MICRO     1,,/0,1,2,3,12D,42D,43D,44D,45D,46D,47D,51D/
 LEN.M    MICRO     1,,/1,1,1,9D,30D,1,1,1,1,1,4,9D/
          ECHO      9,PAR=("PAR.M"),POS=("POS.M"),LEN=("LEN.M"),SY=("MSY
,.M") 
 M.S      MICRO     2,,/SY_./ 
          IFEQ      T.ORD,1,5 
          IFC       NE,/"M.S"/./,4
          IF        -DEF,"M.S"P,1 
 "M.S"P   EQU       POS 
          IF        -DEF,"M.S"S,1 
 "M.S"S   EQU       LEN 
          VFD       LEN/PAR 
 L        SET       L+LEN 
          IFNE      L,60D,1 
          ERR       FIELD SIZES DONT TOTAL 60 BITS ("SEQUENCE") 
          ENDM
          SPACE     3 
          TITLE     DMP.ERR 
 DMP.ERR  MACROE    INSTAB,JMPADDR
          SB3       INSTAB 0
          SX5       JMPADDR 
          EQ        =YERR$RM
          ENDM
          TITLE  KNT.EQU  MACRO  FIELD
*#
*1CD  KNT.EQU MACRO 
*0D   PURPOSE 
*0        EQUATE FIELD TO KNT.IT AFTER INCREMENTING THE SYMBOL KNT.IT 
*         BY 1
*0D   CALL
*0                  KNT.EQU   FIELD 
*0D   PARAMETERS
*0        FIELD     THE SYMBOL THAT IS TO BE DEFINED
*0D   ACTION
*0        IF KNT.IT IS NOT PREVIOUSLY DEFINED, INITIALIZE KNT.IT AS 0,
*         SO THAT THE DEFINED SYMBOL VALUE IS 1.
*         IF KNT.IT WAS PREVIOUSLY DEFINED, KNT.IT IS INCREMENTED BY 1, 
*         AND FIELD IS EQUATED TO IT. 
*0D   REGISTERS USED
*0        NONE
*0D   OTHER CODE REQUIRED 
*0        NONE
*#
 KNT.EQU  MACRO  FIELD
 1.RM     IF     -DEF,KNT.IT
 KNT.IT   SET    0
          NOREF  KNT.IT 
 1.RM     ENDIF 
 KNT.IT   SET    KNT.IT+1 
 FIELD    EQU    KNT.IT 
 KNT.EQU  ENDM
          TITLE     CRMEI 
*#
*1CD  CRMEI MACRO 
*0D   PURPOSE 
*0        GENERATE ONE ELEMENT OF A MESSAGE INSERT LIST.
*0D   CALL
*0        [TAG]     CRMEI    <KEYWORD1>=<VALUE1>[,<KEYWORDN>=<VALUEN>]..
*0D   PARAMETERS
*0        TYPE               TYPE OF CONVERSION DONE BY POST PROCESSOR. 
*                  0=        SAME AS 1 (DEFAULT)
*                  1=        OCTAL CONVERSION 
*                  2=        CHARACTER CONVERSION 
*                  3=        DECIMAL INTEGER CONVERSION 
*                  4=        REAL CONVERSION
*         MODE               MODE OF INSERT 
*                  0=        VALUE CONTAINED IN LIST ELEMENT
*                  1=        DIRECTED (LEN IN WORDS)
*                  2=        CSTRING (LEN IN BYTES) 
*                  3=        BSTRING (LEN IN BITS,
*                            CANT CROSS WORD BOUNDARY)
*         LOC                ADDREAS OF DATA WHEN MODE NOT CONTAINED
*         POS                STARTING BIT OR BYTE POSITION.  DEFAULT=0
*         LEN                LENGTH OF DATA IN BITS, BYTES OR WORDS 
*                            DEPENDING ON MODE.  (DEFAULT=0)
*         DIS      1=        DISPLAY FIRST WORD OF DATA IN DAYFILE. 
*                            USED ONLY ON FIRST LIST ELEMENT.  DEFAULT=0
*         VAL                CONSTANT 48 BITS INCLUDED IN LIST ELEMENT
*                            USED ONLY WHEN MODE IS CONTAINED.
*         EOL      1=        LAST ELEMENT OF INSERT LIST. 
*0D  ACTION 
*0        GENERATE ONE WORD OF DATA USED BY THE ERROR PROCESSOR TO
*         DESCRIBE A DATUM TO BE INCLUDED IN THE TEXT OF AN ERROR OR
*         NOTE AT POST PROCESSOR TIME.  THE SYMBOLS REQUIRED TO 
*         MANIPULATE THE FIELDS OF DATA IN THE LIST ELEMENT ARE 
*         GENERATED BY THE MACRO AND ARE OF THE FORM PAR.S, PAR.P.
*         PAR IS THE PARAMETER NAME, PAR.S IS FIELD SIZE IN BITS AND
*         PAR.P IS THE BIT POSITION OF THE FIELD COUNTING FROM LEFT.
*0D   REGISTERS 
*0        NONE
*0D   OTHER CODE REQUIRED 
*0        NONE
*#
 CRMEI    MACROE    TYPE,MODE,LOC,POS,LEN,DIS,VAL,EOL 
          IFEQ      MODE,0,4
          ECHO      2,PAR=(POS,LEN,LOC) 
          IFC       NE,/PAR//,1 
          ERR       POS,LEN,LOC MAY NOT BE USED WHEN MODE IS CONTAINED
          SKIP      13
          IFC       NE,/VAL//,1 
          ERR       VAL NOT TO BE USED WHEN MODE NOT CONTAINED
          IFEQ      TYPE,2,3
          IFEQ      MODE,3,1
          ERR       TYPE=CHARACTER AND MODE=BSTRING 
          SKIP      7 
          IFEQ      TYPE,3,3
          IFEQ      MODE,2,1
          ERR       TYPE=INTEGER AND MODE=CSTRING 
          SKIP      3 
          IFEQ      TYPE,4,2
          IFNE      MODE,1,1
          ERR       TYPE=REAL AND MODE"DIRECTED 
          VFD       1/EOL,3/TYPE,2/MODE,6/0 
          IFEQ      MODE,0,2
          VFD       48/VAL
          SKIP      1 
          VFD       3/0,1/DIS,1/0,6/POS,1/1,18/LEN,18/LOC 
          IFEQ      EOL,1,9 
 SYMM     MICRO     1,,/PEOL,PTYPE,PMODE,PVAL,PPOS,PLEN,PLOC/ 
 POSM     MICRO     1,,/00D,01D,04D,12D,17D,24D,42D/
 LENM     MICRO     1,,/01D,03D,02D,48D,06D,18D,18D/
          ECHO      5,SYM=("SYMM"),PSN=("POSM"),LNG=("LENM")
 M.S      MICRO     2,,/SYM_./
          IF        -DEF,"M.S"P,1 
 "M.S"P   EQU       PSN 
          IF        -DEF,"M.S"S,1 
 "M.S"S   EQU       LNG 
 CRMEI    ENDM
          TITLE     CLSV$SQ 
*#
*0DC  CLSV$SQ 
*0D   PURPOSE 
*0        LOAD CLSV, ISSUE IT, AND UNLOAD CLSV. 
*0D   PARAMETERS
*0        -GET- OR -PUT-
*#
 CLSV$SQ  MACRO     GP
          LOCAL     RETURN
          IFC       EQ, GP GET ,2 
          SB6       B0
          SKIP      1 
          SB6       -B1 
          SB3       RETURN
          LGO.RM    PLCSV 
 PLCSV    FAKEPL    =XCLSV$SQ 
 RETURN   RJ        =XRM$UTC
 CLSV$SQ  ENDM
          TITLE      CT.6RM    MACRO     L,S,FLD
*#
*1CD  CT.6RM MACRO
*0D   PURPOSE 
*0        KEEP A COUNT OF THE NUMBER OF TIMES A FIT OR FET FIELD IS 
*         REFERENCED BY MACROS  F.RM  SET.RM  ON.RM, OFF.RM.
*0D   CALL
*0        [TAG]     CT.6RM    L,S,FLD 
*0D   PARAMETERS
*0        L         READ  REGISTER (DEFAULT = 1). 
*0        S         WRITE REGISTER (DEFAULT = 7). 
*0        FLD       FIT OR FET FIELD MNEMONIC (W/O BRACKETING #). 
*0D   ACTION
*0        IF THE SYMBOL *#.FLD* IS NOT DEFINED, DEFINE A COMMON BLOCK 
*         (WITH A LABEL DEFINED BY THE MICRO *CB.6RM*) WHICH CONTAINS 
*         TWO WORDS, THE FIRST CONTAINS THE FIELD MNEMONIC
*         LEFT-JUSTIFIED DISPLAY CODE BLANK FILL AND THE SECOND CONTAINS
*         ZERO AND WILL BE USED TO COUNT THE REFERENCES TO THIS 
*         PARTICULAR MNEMONIC.  THIS ACTION IS ONLY DONE ON THE FIRST 
*         ENTRY FOR EACH MNEMONIC.
*0        UPDATE THE COUNT LOCATION BY 1 USING THE REGISTERS SPECIFIED
*         BY  L  AND  S  IN THE PARAMETER LIST. 
*0D   REGISTERS USED
*0        AX.S/L
*0D   OTHER CODE
*0        MACROS-   SETS.RM (IF #.FLD NOT DEFINED)
*         PROGRAMS- NONE
*#
 CT.6RM   MACRO  L,S,FLD
          LOCAL  LL,SS
 6RM.CT   IF     -DEF,#.FLD 
          USE    /"CB.6RM"/ 
          SETS.6RM  FLD 
          DATA      0H_FLD "FLD.WRD"
 #.FLD
          USE    *
 6RM.CT   ENDIF 
          IF     REG,L,2
 LL       SET    1
          SKIP   1
 LL       SET    L 1
 SS       SET    S  7 
          SA.LL  #.FLD
          SX.SS  X.LL+1 
          SA.SS  A.LL 
 CT.6RM   ENDM
          TITLE     SETS.6RM
*#
*1CD  SETS.6RM AND SETT.6RM MACROS
*0D   PURPOSE 
*         SET A (SET) SYMBOL VALUE TO THE BIT SIZE OF A FIELD.
*0D   CALL
*0                  SETS.6RM  (F1,F2, ...)
*0D   PARAMETERS
*0        F1,F2,... LIST KEYWORD FIELD MNEMONICS. 
*0D   ACTION
*0        SETS.6RM IRP-S A CALL TO SETT.6RM 
*0            SETT.6RM  <FLD>,"#_<FLD>_#"    <FLD> = F1/F2/ ... 
*0        WHICH GENERATES A SERIES OF SET SYMBOLS 
*0C       <FLD>.SZB 
*0        THAT HAS THE VALUE OF THE THIRD PARAMETER OF THE KEYWORD
*         MICRO #<FLD>#, NAMELY, THE SIZE OF THE FIELD. 
*0D   REGISTERS USED
*0        NONE
*0D   OTHER CODE
*0        SETS.6RM CALLS SETT.6RM 
*#
 SETS.6RM MACRO     FLD 
          IRP       FLD 
          SETT.6RM  FLD,"#_FLD_#" 
          IRP 
 SETS.6RM ENDM
          TITLE     SETT.6RM
 SETT.6RM MACRO     FLD,T,W,B,P,D1,D2 
#.M#      MICRO     1,4, FLD
"#.M#".SZB  SET     B 
"#.M#".WRD  DECMIC  W,2 
 SETT.6RM ENDM
          TITLE     GET1.SQ   MACRO     OWF,COND
*#
*1CD  GET1.SQ MACRO 
*0D PURPOSE 
*0        GET A WORD IN THE CURCULAR BUFFER 
*0D   CALL
*0        [TAG]     GET1.SQ   [OWF[,COND]]
*0D   PARAMETERS
*0        OWF       FIT FIELD MNEMONIC TO BE SET TO 1 (E.G. OWF,OWN,OWM)
*0        COND      ANY NON-BLANK PARAMETER CAUSES CONDITIONAL CODE TO
*                   BE GENERATED
*0D   ACTION
*0        SET OWF TO 1 IF SPECIFIED AND SET RETURN ADDRESS IN B6 TO 
*         LOCAL SYMBOL AT END OF MACRO. IF COND NOT SPECIFIED, BRANCH 
*         TO GET1 (TO ADJUST BUFFER POINTERS REFLECTING WORD REQUESTED).
*         COND IS NOW IGNORED.
*0D   REGISTERS USED
*0        ALL 
*0D   OTHER CODE
*0        MACROS-   SET.RM
*         PROGRAMS- PUT$SQ
*#
 GET1.SQ  MACRO     OWF,COND
          LOCAL     RET 
          IFC       NE, OWF  ,1 
          SET.RM    OWF,1 
          SB6       RET 
          EQ        =YPTG1$SQ 
 RET      BSS       0 
 GET1.SQ  ENDM
          TITLE     PRTY.SQ   MACRO     IN,TA,TB,ADDR 
*#
*1CD  PRTY.SQ MACRO 
*0D   PURPOSE 
*0        CALCULATE PARITY FOR I-BLOCK AND W-RECORD CONTROL WORDS 
*0D   CALL
*0        [TAG]     PRTY.SQ        IN,TA,TB,ADDR
*0D   PARAMETERS
*0        IN        WORD FOR WHICH TO GENERATE PARITY 
*0        TA        SCRATCH REGISTER
*0        TB        SCRATCH REGISTER
*0        ADDR      ADDRESS TO STORE PARITY ADDED WORD
*0D   ACTION
*0        CALCULATE PARITY BY PUTTING INTO X.TA THE NUMBER OF BITS SET
*         IN X.IN AND OR-ING INTO X.TB WITH A WORD=-1. SHIFT RESULT 
*         LEFT 59. OR X.IN (I-BLOCK OR W-RECORD CONTROL WORD) WITH
*         NEGATIVE OF ABOVE RESULT. STORE IN ADDR IF SPECIFIED OR 
*         B3-B1 IF ADDR IS NOT SPECIFIED.  NOTE THAT PRTY.SQ CAN BE 
*         USED TO SET ODD PARITY FOR ANY 60 BIT WORD IN WHICH THE 
*         PARITY BIT IS BIT 59. 
*0D   REGISTERS USED
*0        X.TA,X.TB,X7,A7 
*0D   OTHER CODE
*0        NONE
*#
 PRTY.SQ  MACRO     IN,TA,TB,ADDR 
* DEFINE SET SYMBOL SO ALL MACRO REFERENCES APPEAR IN COMPASS X-REF LIST
 PRTY.SQ  SET       0 
          CX.TA     X.IN
          MX.TB     59
          BX.TB     X.TB+X.TA 
          LX.TB     59
          BX7       -X.TB+X.IN
          IFC       NE, ADDR
          SA7       ADDR
          ELSE      1 
          SA7       B3-B1 
 PRTY.SQ  ENDM
          SPACE     20,40 
 AAM      CLASS    (AAM MACROS) 
*#
*1DC  AAM MACROS
*[    +---------------------------------------------------------------+ 
*X    AAM MACROS
*0        TOOLS FOR THE 1.5 ADVANCED ACCESS ROUTINES. 
*0     ---------------------------------------------------------------
*0D       R6RM, R.6RM  (ALSO EPX6, DMP.ERR, AND KNT.EQU -- PREVIOUSLY 
*         DESCRIBED)
*[    +---------------------------------------------------------------+ 
*#
          TITLE     R6RM MACRO A,C,D,E
*#
*1CD  R6RM MACRO
*0D   PURPOSE 
*0        ADD CIO FUNCTION CODE (OR PP PPROGRAM PARAMETER) AND INDEX
*         TO SUBPROGRAM R6RM.RM ARGUMENT FOR MACRO R.6RM. 
*0D   CALL
*0        [TAG]     R6RM      A,C,D,E 
*0D   PARAMETERS
*0        A         FUNCTION NAME (SYSTEM OR FILE ACTION MACRO).
*0        C         INDEX BIT (1 = INCREMENT BITS 9-14, 0 = NO ACTION). 
*0        D         CIO FUNCTION CODE OR PP PROGRAM PARAMETER ( 3-DIGIT 
*                   OCTAL NUMBER).
*0        E         VALID FUNCTION NAME 
*0D   ACTION
*0        IF *C* IS NON-ZERO, INCREMENT R6RM.RM ARGUMENT BITS 9-14 BY 1.
*         IF REQUESTED FUNCTION NAME (*A*) EQUALS VALID FUNCTION NAME 
*         (*E*), STORE THE CIO FUNCTION CODE (OR PP PROGRAM PARAMETER)
*         IN R6RM.RM ARGUMENT BITS 0-8 AND GENERATE AN   IFNE 
*         SO THAT SUBSEQUENT R6RM CALLS IN R.6RM  WILL NOT BE EXECUTED. 
*0D   REGISTERS USED
*0        NONE
*0D   OTHER CODE
*0        NONE
*#
R6RM MACRO A,C,D,E
  IFNE C,,1 
' SET '+1000B 
  IFC EQ, A E ,2
' SET '+D_B 
  IFNE
  ENDM
          TITLE     R.6RM MACRO A,RW
*#
*1CD  R.6RM MACRO 
*0D   PURPOSE 
*0        SET UP A CALL TO SUBPROGRAM R6RM.RM TO ISSUE MONITOR REQUEST. 
*0D   CALL
*0        [TAG]     R.6RM     A,RW
*0D   PARAMETERS
*0        A         FUNCTION NAME (SYSTEM OR FILE ACTION MACRO).
*0        RW        RECALL/WAIT FLAG  (R=RECALL,W=WAIT).
*0                  NOTE:  LEGAL CALLING SEQUENCE MACROS ARE
*0                            OPENNR    OPEN REQUESTS       (NO REWIND) 
*                             OPEN                          (REWIND)
*                             CLOSENR   CLOSE REQUESTS      (NO REWIND) 
*                             CLOSE                         (REWIND)
*                             CLOSEUN                       (UNLOAD)
*                             CLOSERT                       (RETURN)
*                             READ      READ REQUESTS 
*                             REWRITE   REWRITE REQUESTS
*                             REWRITER                      (EOR) 
*                             REWRITEF                      (EOF) 
*                             WRITE     WRITE REQUESTS
*                             WRITER                        (EOR) 
*                             WRITEF                        (EOF) 
*                             STATUS    FET STATUS FIELDS   (NO PP CALL)
*                             MSD                           (PP *MSD*)
*                             READCARD  READ CONTROL CARD   (PP *ACE*)
*                             BKSPCARD                      (PP *ACE*)
*                             MESSAGE   DAYFILE MESSAGE     (PP *MSG*)
*                             FLASH                         (PP *MSG*)
*                             TIME      TIME/DATE REQUESTS  (PP *TIM*)
*                             DATE                          (PP *TIM*)
*                             CLOCK                         (PP *TIM*)
*                             JDATE                         (PP *TIM*)
*                             RTIME                         (PP *TIM*)
*                             MEMORY    FIELD LEN REQUEST   (PP *MEM*)
*                             PERMISS                       (PP *PRM*)
*                             EXTEND    PF EXTEND           (PP *PFE*)
*                             ENDRUN    END PROGRAM         (PP *END*)
*                             ABORT     ABORT PROGRAM       (PP *ABT*)
*                             FETPERM   FET PERMFILE PERMISSIONS
*0D   ACTION
*0        SET UP 18-BIT CALLING ARGUMENT AS FOLLOWS 
*                   BIT 16 = WAIT 
*                   BIT 15 = RECALL 
*                   BITS 9-14 = JUMP INDEX TO CODE ASSOCIATED WITH
*                   THE SPECIFIED FUNCTION NAME IN SUBPROGRAM R6RM.RM 
*                   BITS 0-8    CIO OP CODE (OR PP PROGRAM PARAMETER).
*0        FIRST INITIALIZE ARGUMENT TO ZERO.
*0        IF *RW* EQUALS *R*, SET RECALL BIT; IF IT EQUALS *W*, SET 
*         WAIT BIT.  THEN CALL MACRO  R6RM  FOR EACH FUNCTION NAME TO 
*         SET UP CIO FUNCTION CODE OR PARAMETER.
*0        LOAD B1 WITH WORD SET UP AS DESCRIBED ABOVE AND CALL
*         SUBPROGRAM  R.6RM.
*0        ISSUE ERROR MESSAGE IF FUNCTION NAME IS ILLEGAL.
*0D   REGISTERS USED
*0        B1
*0D   OTHER CODE
*0        MACROS-   R6RM
*         PROGRAMS- R6RM.RM 
*#
R.6RM MACRO A,RW
' SET 0          NO RECALL. 
  IFC EQ, R RW ,1 
' SET 100000B    RECALL, NO WAIT. 
  IFC EQ, W RW ,1 
' SET 300000B    RECALL, WAIT.
  R6RM A,1,120,OPENNR   OPEN REQUESTS.
  R6RM A,0,160,OPEN 
  R6RM A,1,130,CLOSENR  CLOSE REQUESTS. 
  R6RM A,0,150,CLOSE
  R6RM A,0,170,CLOSEUN
  R6RM A,0,174,CLOSERT
  R6RM A,1,010,READ     READ REQUESTS.
  R6RM A,1,214,REWRITE  REWRITE REQUESTS. 
  R6RM A,0,224,REWRITER 
  R6RM A,0,234,REWRITEF 
  R6RM A,1,014,WRITE    WRITE REQUESTS. 
  R6RM A,0,024,WRITER 
  R6RM A,0,034,WRITEF 
  R6RM A,1,000,STATUS   FET STATUS FIELDS.
  R6RM A,1,000,MSD
  R6RM A,1,010,READCARD      READ CONTROL-CARD. 
  R6RM A,0,040,BKSPCARD 
  R6RM A,1,000,MESSAGE
  R6RM A,0,001,FLASH
  R6RM A,1,000,TIME 
  R6RM A,0,001,DATE 
  R6RM A,0,002,CLOCK
  R6RM A,0,003,JDATE
  R6RM A,0,004,RTIME
  R6RM A,1,001,MEMORY        SYSACTION WITH CODE AT BIT 24. 
  R6RM A,1,060,PERMISS
  R6RM A,1,030,EXTEND 
  R6RM A,1,000,ENDRUN 
  R6RM A,1,000,ABORT
  R6RM A,1,030,FETPERM             PERMFILE PERMISSIONS FROM FET. 
  ERR            ILLEGAL FUNCTION NAME. 
  ENDIF 
  SB1 '   BIT LEGEND: 16=RECALL, 15=WAIT, 9-14=INDEX, 0-8=OPCODE. 
          RJ        =YR$6RM 
  ENDM
