*DECK CTLDRM
          IDENT     CTL$RM
          COMMENT   CRM CONTROLLING ROUTINE.
          TITLE     CTL$RM - CRM CONTROLLING ROUTINE
          SST 
          LIST      F 
          B1=1
  
          ENTRY     LOF$RM
 LOF$RM   VFD       42D/,18D/=XLIST$RM
          TITLE     ENTRY TABLE 
*#
*0D   ENTRY TABLE 
*0D   PURPOSES
*0        1.  PROVIDE ADDRESSES OF CRM AND NON-CRM ENTRY POINTS THAT
*         ARE STATICALLY LOADED.
*         2.  PROVIDE A PLACE FOR FDL TO PUT THE ADDRESSES OF ENTRY 
*         POINTS THAT IT LOADS. 
*0D   CONTENTS
*0        ANY CMM AND FDL ENTRY POINTS NEEDED BY CAPSULES.
*         SUBROUTINES IN CTL$RM.
*         CERTAIN SYSTEM ROUTINES AS SYS=.
*         NAMES OF CAPSULES TO BE LOADED, PLUS THEIR ENTRY POINTS.
*#
          ENTRY     RM$PLL
 RM$PLL   VFD       42D/,18D/PLL
 PLL      VFD       42D/,18D/RM$PL
          VFD       42/0,18/RM$PLB
          CON       0 
  
          ENTRY     RMP$FE
* CALL /PASSMAC/
*CALL /PASSMAC/ 
          ENTRY     RM$PL 
* CALL /PASSLOC/
*CALL /PASSLOC/ 
  
          ENTRY     RM$PLB
          ENTRY     CMMX.AA 
RM$PLB    VFD       12/0021B,12/ENDPLB-RM$PLB-1,36/0
          PLY       AAM$BL
          PLY       AAM$GO
          PLY       AAM$LOK 
          PLY       AAM$PBC 
 CMMX.AA  PLY       CMMX$AA        ENABLE CDCS RECOVER FROM CMM OVERFLOW
 .IFNOS   IFC       EQ,/"OS.NAME"/KRONOS/ 
.NOSV2    IF        MIC,NOSVER
          PLX       LFM=
 .NOSV2   ENDIF 
 .IFNOS   ENDIF 
          PLL       RM$FAT
          PLL       RM$LVL
ENDPLB    BSS       0 
*     BAMGRP AND BAMLIB MUST STAY TOGETHER
 BAMGRP   VFD       42/0LBAM,18/42
 BAMLIB   CON       0LBAMLIB
          CON       0 
          ENTRY     RM$CIO,RM$RCLA
          ENTRY     OFCT$RM 
          DATA      0              ZZZZZDG FLAG - MUST PRECEDE OFCT$RM
 OFCT$RM  DATA      0              NUMBER OF OPEN FILES,
                                   INCREMENTED BY OPEN, 
                                   DECREMENTED BY CLOSE.
* CALL /CIODRM/ 
*CALL /CIODRM/
          ENTRY     CHWR$RM 
* CALL /CHWRDRM/
*CALL /CHWRDRM/ 
          ENTRY     MOVE$RM 
* CALL /MOVEDRM/
*CALL /MOVEDRM/ 
  
 21B      IS.IN     5 
          TITLE     RM$ABUF - ALLOCATE A BUFFER 
*#
*1CD  RM$ABUF 
*0D   PURPOSE 
*0        ALLOCATE A BUFFER USING CMM.
*0D   ACTION
*0        IF FIRST= FIT+#FTL# OR 0, THEN A BUFFER NEEDS TO BE ALLOCATED.
*         IF BBH IS ON, A BELOW-HHA GROUP WILL BE ACTIVATED AND USED. 
*         CMM IS CALLED TO ALLOCATE A FIXED POSITION, FIXED SIZE BLOCK
*         OF BFS WORDS.  THE FET POINTERS ARE SET.    BAL IS TURNED ON
*         TO INDICATE CMM ALLOCATION. 
*0D   REGISTERS 
*0        B3     EXIT ADDRESS 
*         B1=1, X0, B6, A0, X5=FIT+21 SAVED 
*#
  
 RM$ABUF  ENTRY$
          F.RM      FIRST,B4
          SB5       A0+#FTL#
          EQ        B4,B5,ABUF1 
          ZR        B4,ABUF1
          JP        B3             EXIT IF USER SPECIFIED BUFFER
  
 ABUF1    SB2       B6             SAVE B6
  
          RJ        RM$UTC         UNLOAD ANY TRANSIENT ROUTINES
  
          BX3       0              NO GROUP-ID
          OFF.RM    BBH,ABUF2      IF WANT BUFFER ABOVE HHA 
          SX1       =YCMM.AGR 
          NG        X1,ABUF2       IF CMM.AGR NOT LOADED
          SA3       GROUPID 
          NZ        X3,ABUF2       IF HAVE GROUP ID 
          SX1       B1             X1=BELOW-HHA FLAG
  
          RJU       =YCMM.AGR      ACTIVATE GROUP 
  
          BX6       X2
          BX3       X2
          SA6       GROUPID 
 ABUF2    LX3       12             X3 = GROUP ID, SIZE CODE 
          F.RM      BFS,X2         X2 = SIZE
  
          SB5       =YCMM.ALF 
          SX6       357B+1S17 
          NG        B5,=XERR$RM 
          RJU       =XCMM.ALF      ALLOCATE FIXED 
  
          SB6       B2             RESTORE B6 
          BX7       X1             FWA OF BLOCK 
          SET.RM    IN,X7,7,2 
          SET.RM    OUT,X7,7,2
          SET.RM    FWB,X1,,2 
          SET.RM    PIN,X1,,2      FOR PUT
          SET.RM    BLP,X1,,2      FOR SKIPB
          F.RM      BFS,3 
          IX6       X1+X3 
          SET.RM    LIMIT,X6
          SET.RM    BAL,1          BUFFER IS ALLOCATED
          JP        B3             RETURN 
  
 GROUPID                           ID FOR BELOW-HHA GROUP (CMM) 
          TITLE     RM$PD - CHECK PD/OC/FNF 
*#
*1CD  RM$PD 
*0D   PURPOSE 
*0        CHECK  PD,  OC,  AND  FNF 
*0D   CALL
*0        SB5    PD.I  FOR GET, GETN, GETNR, GETWR
*                PD.O  FOR PUT, PUTWR, WEOS, WEOP, DELETE, REPLACE
*         RJ     =XRM$PD
*0D   REGISTERS USED
*0        X5 = WORD WITH FNF,OC,PD
*         B5 = PD.I OR PD.O 
*         X17, B3  DESTROYED
*#
 FOC      COMPOSED  FNF,1,OC,2
 FOP      COMPOSED  FOC,3,PD,3
          ENTRY     RM$PD,RM$FAT
 RM$PD
          F.RM      FOP,B3         1/FNF,2/OC,3/PD
          EQ        B3,B5,RM$PD    FNF=NO, OC=OPE, PD=WHATEVER
          SB3       B3-#OPE#*8-#IO# 
          ZR        B3,RM$PD       IF PD=IO 
  
          ENTRY     RM$FOC
 RM$FOC   BSS 
          ON.RM     FNF,RM$FAT
          SX6       110B           FILE NOT OPEN
          NE.RM     OC,#OPE#,=XERR$RM,B2
          SX6       B5-PD.I-071B
          BX6       -X6            ERROR 70 OR 71 
          EQ        =XERR$RM
  
 RM$FAT   BSS       0 
          SX6       115B+1S17      OUTSTANDING FATAL ERROR. 
          EQ        =XERR$RM
          TITLE     LOAD AND UNLOAD ROUTINES
*#
*1CD  RM$LOAD, RM$LGO, RM$BLD 
*0D   PURPOSE 
*0        RM$LDC:   UNLOAD TRANSIENTS AND LOAD A CAPSULE. 
*0        RM$BLD:   UNLOAD TRANSIENTS, LOAD A BAM CAPSULE.
*0        RM$LGO:   CHECK FO, THEN IF BAM DO RM$LOAD, THEN JUMP TO IT.
*0D   CALL
*0        RM$LDC    SA2  WORD OF LOADER ENTRY TABLE 
*                   SX4  ADDR OF GROUP NAME WHICH IS FOLLOWED BY LIBLIST
*                   RJ   RM$LOAD
*0        RM$BLD:   SA2  WORD OF LOADER ENTRY TABLE 
*                   RJ   RM$BLGO
*0        RM$LGO:   SA2  WORD OF LOADER ENTRY TABLE 
*                   SX3  MASK OF FO-S ALLOWED (0=NO CHECK)
*                   EQ   RM$LFO 
*0D   ACTION
*0        SEE PURPOSE, PLUS 
*         A DYNAMICALLY LOADED CAPSULE IS ASSUMED TO START WITH A 
*         REFERENCE COUNT OF 1; THE COUNT IN A CAPSULE ALREADY IN CORE
*         (STATIC OR DYNAMIC) IS INCREMENTED BY 1.
*0D   RETURNS 
*         X6     0 IF CAPSULE ALREADY IN CORE (STATIC OR DYNAMIC),
*                NAME OF CAPSULE IF LOAD REQUIRED.
*         B5     ENTRY ADDRESS IN CAPSULE.
*0D   REGISTERS SAVED 
*         B1=1, X5, B3, B6, A0
*         B4=COP IF AAM 
*#
          ENTRY     RM$LGO,RM$BLD,RM$LDC
 RM$LGO   SPACE     4,8 
 RM$LGO   BSS 
          ZR        X3,NOTFO       IF DONT WANT TO CHECK FO 
          F.RM      FO,B5 
          AX3       B5
          LX3       59
          PL        X3,ERR245      IF ILLEGAL FO
          AAM.FO    =YAAM$GO,B5    JUMPS IF AAM 
 NOTFO    SX4       BAMGRP
          RJ        RM$LOAD 
          JP        B5
 RM$BLD   SPACE     4,8 
 RM$BLD 
          SX4       BAMGRP
          RJ        RM$LOAD 
          EQ        RM$BLD
 RM$LDC   SPACE     4,10
 LOADED   SA3       B5-B1 
          PL        X3,CAPWD
          SA3       X3             IF SECONDARY ENTRY POINT 
 CAPWD    SX2       B1
          IX7       X3+X2 
          SA7       A3             INCREMENT CAPSTAT WORD BY ONE
  
 RM$LDC   BSS 
 RM$LOAD
          SA3       RM$TMP
          SB5       X2             ADDR OF ENTRY IN CAPSULE 
          BX6       X3
          GT        B5,B0,LOADED
          SX0       A2-#PLAO#      SAVE PASSLOC ADDR
          LX4       18
          SB2       B6             SAVE B6
          BX0       X0+X4          SAVE PASSLOC ADDR AND GRP/LIB ADDR 
          RJ        RM$UTC         UNLOAD TRANSIENTS
          SA3       X0             FIRST WORD OF PASSLOC ENTRY
          LX0       -18 
          SA1       X0             GROUP NAME 
          LX0       18
          MX7       42
          BX7       X7*X3          CAPSULE NAME 
          SX3       A1+B1          LIBRARY LIST 
          BX2       X7
          SA4       RM$PLL         X4=ADDR OF PASSLOC LIST
          SA7       CAPTEMP 
  
          SB5       =XFDL.LDC 
          NG        B5,FDLERR 
          RJU       =XFDL.LDC      LOAD CAPSULE 
  
          SB6       B2             RESTORE B6 
          NZ        X6,FDLERR      IF FDL ERROR 
          SA1       X0
          MX4       42
          AX0       18             PTR TO GROUP NAME
          SB5       X1             ENTRY ADDR 
          IFNE      #PLAO#,,2 
          SA2       A1+#PLAO# 
          SB5       X2             ENTRY ADDR 
          BX6       X4*X1          CAPSULE NAME (USED BY TRANSIENTS)
          BX6       X6+X0          42/CAPSULE NAME, 18/PTR TO GROUP NAME
          GT        B5,B0,RM$LOAD  RETURN IF LOAD SATISFIED EXT 
  
 FDLERR   BSS       0 
          SA1       CAPTEMP 
          BX7       X1
          SA6       A1+B1          FDL ERROR CODE 
          SA7       A6+B1          FDL CAPSULE NAME 
          CRMEP     ES=347B,INA=FDLDIS
          EQ        ERR$RM
  
 FDLDIS   BSS       0 
          CRMEI     MODE=1,TYPE=3,LEN=1,LOC=FDLCODE 
          CRMEI     MODE=1,TYPE=1,LEN=1,LOC=CAPNAME,EOL=1 
 CAPTEMP  DATA      7L             SUBJECT OF CURRENT FDL CALL
 FDLCODE  DATA      0              FDL ERROR CODE 
 CAPNAME  DATA      7L             SUBJECT OF FDL ERROR 
  
 ERR245   SX6       245B
          EQ        =XERR$RM
 RM$UTC   SPACE     4,8 
*#
*1CD  RM$UTC - UNLOAD TRANSIENT CAPSULES
*0D   PURPOSE 
*0        CERTAIN CAPSULES IDENTIFY THEMSELVES AS TRANSIENTS BY STORING 
*         THEIR CAPSULE NAME IN RM$TMP. THIS ROUTINE CHECKS THAT LIST 
*         AND UNLOADS ANY CAPSULES LISTED.
*0D   CALL
*0        TO USE RM$UTC TO FORCE UNLOAD A CAPSULE, FIRST STORE ITS NAME 
*         INTO RM$TMP.
*         RJ     RM$UTC 
*0D   REGISTERS SAVED 
*0        A0, X05, B23, B1=1
*#
  
          ENTRY     RM$UTC,RM$TMP 
 RM$UTC 
          SA2       RM$TMP         X2 = CAPSULE NAME
          SA4       RM$PLL         X4 = ADDR OF LIST OF PASSLOC TABLES
          ZR        X2,RM$UTC      EXIT 
          SA1       X2             X1 = GROUP NAME
          BX7       X2
          BX6       0 
          SA6       A2
          SA7       CAPTEMP 
          SB4       =XFDL.ULC 
          LE        B4,B0,FDLERR   AVOID POSSIBLE RANGE ERROR 
          RJU       =XFDL.ULC      UNLOAD CAPSULE 
          NZ        X6,FDLERR 
          EQ        RM$UTC         EXIT 
  
  
 RM$TMP   BSSZ      1              NAME OF TRANSIENT
          ENTRY     RM$LVL
 RM$LVL   VFD       42/0,18/80126  LEVEL R6B JULIAN DATE
 RM$ULJ   SPACE     4,8 
*#
*1CD  RM$ULJ
*0D   PURPOSE 
*0        UNLOAD, LOAD, AND JUMP. 
*         WHEN A CAPSULE WANTS TO UNLOAD ITSELF, THEN LOAD ANOTHER
*         CAPSULE, IT COMES HERE.  THE UNLOAD-BEFORE-LOAD SEQUENCE IS 
*         AN ATTEMPT TO PREVENT HOLES IN CMM STORAGE. 
*0D   REGISTERS 
*         B2     INDICATOR OF WHICH CAPSULE (SEE CODE)
*         B3     =0 IF WANT TO JUMP TO NEW CAPSULE, ELSE EXIT ADDR
*         SAVED  A0, B1=1 
*#
  
          ENTRY     RM$ULJ
 RM$ULJ   RJ        =XRM$UTC       UNLOAD 
          SA4       ULJTBL+B2 
          SA2       X4             CAPSULE
          AX4       30             GROUP NAME + LIBLIST 
          ZR        X4,JPB3        FOR CLSF 
          RJ        =XRM$LOAD 
 JPB3     BSS 
          JP        B3
  
 ULJTBL   VFD       12/,18/BAMGRP,12/,18/PL.COMM+#PLAO# 
          VFD       12/,18/BAMGRP,12/,18/=YRMP$LR 
          CON       0              FOR CLSF TO UNLOAD ITSELF
          TITLE     RM ENTRY POINTS 
 CLOF$RM  SPACE     4,8 
 CLOF$RM  ENTRY$
          ON.RM     FNF,=XRM$FAT
          LGO.RM    PL.CLSF 
 OPNM$RM  SPACE     4,8 
 OPNM$RM  ENTRY$
          SB3       B0             OPEN FLAG
 OPST     BSS       0 
          LGO.RM    PL.OPEN 
 SFIT$RM  SPACE     4,8 
 SFIT$RM  ENTRY$
          SB3       B1             SETFIT FLAG
          EQ        OPST
          TITLE     SOME USER ENTRY POINTS
*#
*0DC  GENERAL FLOW OF ENTRY XXXX$RM 
*0        ENTER VIA SB6, EQ.  QUICKLY LOAD THE FIT WORD CONTAINING
*             THE FIELDS NEEDED IN CTL. 
*0        CHECK PD (SOME ROUTINES). 
*0        CHECK FOR THE FILE BEING OPEN (SEVERAL ROUTINES). 
*0        CHECK FNF (ALL).
*0        STORE MOST PARAMETERS.
*0        LOAD AND JUMP TO THE APPROPRIATE ROUTINE. 
*#
*#
*1CD  RM$PARO, RM$PARI, RM$PARP 
*0D   PURPOSE 
*0U       ENTRY     PARAMETERS             CALLERS
*         RM$PARO   POS,KP,KA,EX,RL,WSA    PUT(AAM),DLT,REPL
*                          WA,EX,RL,WSA    PUT(BAM) 
*         RM$PARI   MKL,KP,KA,EX,RL,WSA    GET(AAM),SEEK,START,GETN 
*                       WA,EX/DX,RL,WSA    GET(BAM) 
*#
 GET$RM   SPACE     4,8 
 GET$RM   ENTRY$
          F.RM      FO,B4 
          ON.RM     FNF,RM$FAT     IF OUTSTANDING FATAL ERROR 
          AAM.FO    AAGET,B4       JUMP IF AAM
          F.RM      FOJG,B3,+RM$G1 RETURN ADDR FOR PARAMS 
          SA4       B6-B1          PARM FLAGS 
          ERRNZ     #SQ#  NEXT INST EXPECTS SQ=0
          NZ        B4,PAR.WA      IF FO=WA 
          LX4       59-27 
          PL        X4,RESPAR      IF WA NOT SPECIFIED
          F.RM      DVT,X1
          SX1       X1-2ROD 
          NZ        X1,RESPAR      IF NOT OPTICAL DISK DEVICE 
          SA1       A0+11B
          MX7       30
          BX7       -X7*X1
          LX6       30
          BX7       X6+X7 
          MX6       1 
          BX7       X6+X7          SET V BIT
          SA7       A1             STORE RANDOM ADDRESS FOR OD
 RESPAR   BSS       0 
          SA4       B6-B1 
          LX4       37-4           DX 
          SET.RM    PRD,0,7,1      NOT PARTIAL
          SB4       B1             NOT PARTIAL
  
          ENTRY     RM$P4G
 RM$P4G   BSS 
          PL        X4,PAR3        IF NO DX SPECIFIED 
          NG        B2,BIG.714     IF BAD VALUE 
          SET.RM    DX,B2,7,1 
          EQ        PAR3
  
 AAGET    SB4       #GET# 
          EQ        =YRM$PARI      GO STORE PARAMETERS, THEN TO AAM$GO
  
          ENTRY     RM$G1 
 RM$G1    SB4       PL.GET
          SB5       PD.I           FOR RM$PD AND GPTM$SQ
          EQ        LOADGP         WITH B3=GET.PROC 
 PUT$RM   SPACE     4,8 
 PUT$RM   ENTRY$
          SB4       #PUT# 
          ON.RM     FNF,RM$FAT     IF OUTSTANDING FATAL ERROR 
          AAM.FO    =YRM$PARO 
          F.RM      FOJP,B3,+RM$P1 RETURN ADDR FOR PARAMS 
          SET.RM    PPT,0,7,1      NOT PARTIAL
          SA4       B6-B1          PARM FLAGS 
  
 PAR.WA   LX4       59-27          5TH
          PL        X4,PAR4 
          SET.RM    WA,X6,7,1,715  WA 
 PAR4     BSS 
          LX4       1 
          SB4       B1             NOT PARTIAL
          EQ        RM$PAR4 
  
          ENTRY     RM$EREX 
 RM$EREX  SA4       B6-B1 
          SB3       =XERR$RM
          LX4       37-4           EX FLAG
*                                  GO STORE EX BEFORE GOING TO ERR$RM 
  
          ENTRY     RM$PAR4 
 RM$PAR4  BSS 
          PL        X4,PAR3 
          NG        B2,BIG.714     IF BAD EX ADDR 
          SET.RM    EX,B2,7,1      EX 
          AAM.FO    PAR3
          SB2       B4-#RPL#
          NZ        B2,PAR3        IF NOT REPLACE ON SQ FILE, SET RRL 
          F.RM      RT
          SX1       X1-#WT# 
          ZR        X1,PAR2        IF RPLC AND RT=W, SKIP RRL SET 
 PAR3     LX4       1 
          ZR        B4,PAR2        IF PARTIAL AND MID-RECORD
          NG        X4,PAR.RL 
          F.RM      RL,X3 
 PAR.RL   SET.RM    RRL,X3,7,1,713 RL WILL COUNT UP TO RRL
  
 PAR2     LX4       1 
          PL        X4,PAR.XIT
          SET.RM    WSA,X2,7,1,712 WSA
  
 PAR.XIT  JP        B3             RETURN 
  
 BIG.714  SX6       714B
          EQ        =XERR$RM
  
          ENTRY     RM$P1 
 RM$P1    SB4       PL.PUT
          SB5       PD.O           FOR RM$PD AND GPTM$SQ
  
 LOADGP   RJ        =XRM$PD        CHECK PD,OC,FNF
          F.RM      DCKJ,X6 
          SB3       B0             GET/PUT, NOT SKFP/WEOX 
          ERRNZ     #PLAO#         CODE BELOW NEEDS CHANGING IF ERROR 
          LX6       -1             FLAG IN TOP, OFFSET IN BOTTOM
          SA2       B4+X6          GET$XX OR PUT$XX 
          BX3       0              NO FO CHECK
          PL        X6,=XRM$LGO 
          SB3       B5             GET/PUT INDICATOR (=PD.I OR PD.O)
          SA2       PL.GP+X6       GPXX$SQ
          EQ        =XRM$LGO       GO TO IT (SENDING B3)
          END 
