*DECK,INI 
USETEXT CYBRDEF 
USETEXT IP$COM
USETEXT MISC$ 
USETEXT RBF$LEV 
USETEXT ABH$COM 
USETEXT ACN$COM 
USETEXT CHN$COM 
USETEXT GLOBALI 
USETEXT RBF$COM 
USETEXT SMDEF 
USETEXT SM$COM
      PROC INI; 
      BEGIN # INI # 
*IF DEF,IMS 
 #
*1DC  INI 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        INI                 SEYUNG OH            OCT 25,1979 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        INI CHECKS FOR PROPER CALL OF RBF TO THE CONTROL POINT,
*        INITIALISES TABLE SET UP, NETS ON TO THE NETWORK, AND
*        INITIALISES BUFFER SPACE.
* 
*     3. METHOD USED. 
* 
*        1. TO CHECK THAT RBF IS PROPERLY CALLED TO A CONTROL POINT 
*           RBF CHECKS ITS SUBSYSTEM ID.  IF IT IS NOT
*           THE PROPER VALUE INI ISSUED A DAYFILE MESSAGE AND ENDS
*           RBF.
*      INI CALL CTRLCDP TO PROCESS ANY CONTROL CARD PARAMETERS
*           INI CALLS NETREL TO INITIALIZE THE ZZZZZDN FILE.
* 
*        2. INI CALLS NETON TO INITIALISE COMMUNICATION WITH THE NETWORK
* 
*        3. INI CALLS TSBINIT TO INITIALISE THE DYNAMIC BUFFER MANAGER. 
* 
*           WHICH IS NOT POSSIBLE AT COMPILE TIME.
* 
*        5. LINK QUEUE CONTROL MODULE TO EVENT CHAIN. 
* 
*        6. CALL SCHEDULER TO BEGIN MAIN LOOP.
* 
*     4. ENTRY PARAMETERS. NONE.
* 
*     5. EXIT PARAMETER. NONE.
* 
*     6. COMDECKS CALLED. 
*        RBF$COM
* 
*     7. ROUTINES USED. 
*        CTRLCDP             PROCESS CONTROL CARD PARAMETERS
*        CHKSSID             CHECK SUBSYSTEM ID 
*        SYSTEM 
*        NETON
*        NETPUT              SEND NETWORK MESSAGE 
*        NETREL              RELEASE DEBUG LOG FILE 
*        MESSAGE
*        TSBINIT
*        SCH
*        GETBUF 
*        ENDRBF 
*        LINK 
*        QTEST
* 
*     8. DAYFILE MESSAGES.
*        "RBF STARTED"
*        "NETON ACCEPTED" 
*        "RBF NOT ENABLED"
*        "RBF ENDED"
*        "RBF NOT STARTED PROPERLY, USE N.RBF"
*        "ANOTHER RBF ALREADY NETTED ON"
 #
*ENDIF
  
      DEF CONSOLE # O"005 00 000000" #;  # FUNCTION CODE FOR CPM.      #
      DEF MSGLINE2 # O"002 00 000000" #; # FUNCTION CODE FOR MSG.      #
  
      XREF PROC NETON;       # NETS ON RBF                             #
      XREF PROC CTRLCDP;     # PROCESS CONTROL CARD PARAMETERS        # 
      XREF PROC NETPUT;      # NETPUT                                  #
      XREF PROC NETREL;      # RELEASE NETWORK DEBUG LOG FILE          #
      XREF PROC SYSCALL;     # SYSTEM CALL                             #
      XREF PROC TSBINIT;     # INITIALISE BUFFER MANAGER               #
      XREF PROC MESSAGE;     # ISSUE DAYFILE MESSGAES                  #
      XREF PROC SCH;         # SCHEDULER                               #
      XREF PROC QTEST;       # EVENT PROCESSOR TO TEST QCM CALL N      #
      XREF LABEL ROLLRTN; 
      XREF FUNC GETBUF U;    # ALLOCATES BUFFER                        #
      XREF FUNC ISC63 I;                         # CHECK FOR C63 SET   #
      XREF PROC ENDRBF;      # TERMINATE RBF EXECUTION                 #
      XREF PROC LINK;        # LINK ACN TO MODULE                      #
      XREF PROC WAIT; 
      XREF PROC WAITSM; 
      XREF ITEM SRHTIME U;   # ROLLED OUT PERIOD FOR RBFBONE           #
      XREF FUNC CHKSSID;     # CHECK SUBSYSTEM ID # 
  
      XREF ARRAY RBFKVER[0:0] S(2);# DEFINED BY COMPASS IDENT RBFKDS   #
        BEGIN 
        ITEM KVERSION C(00,00,13); # RBF VERSION NO. FOR THE K-DISPLAY #
        ITEM KLEVEL   C(01,18,07); # PSR LEVEL NO. FOR THE K-DISPLAY   #
        END 
  
      XREF ITEM RBFKINP;     # K-DISPLAY OPERATOR INPUT AREA           #
      XREF ITEM RBFKDS;      # K-DISPLAY BUFFER AREA (DISPLAY CODE)    #
      XREF ITEM ROLLFWA;     # FIRST WORD TO ROLLOUT                   #
      XREF ARRAY ROLLIN;
           ITEM ROLLADR      U (0, 12, 18); 
  
      ARRAY CPMPARAM[0:0] S(1); # CPM CONSOLE FUNCTION PARAMETER BLOCK #
        BEGIN 
        ITEM KZEROFIELD U(00,00,06); # ZERO BIT 58 FOR THIS CPM FUNCT. #
        ITEM KADDRINPUT U(00,06,18); # K-INPUT BUFFER ADDRESS          #
        ITEM KADDRRIGHT U(00,24,18); # K-RIGNT SCREEN BUFFER ADDRESS   #
        ITEM KADDRLEFT  U(00,42,18); # K-LEFT SCREEN BUFFER ADDRESS    #
        END 
  
      COMMON CONVTBL; 
        BEGIN 
        ARRAY TABLE S(13);
          BEGIN                                  # CHARACTER CONVERSION#
          ITEM TB8T6 C (0,0,127);                # TABLE               #
          END 
        END 
  
      ARRAY RBFNOTENABL S(2); 
        BEGIN 
        ITEM RBFNOTENMSG C (0,0,15) = ["RBF NOT ENABLED"];
        ITEM RBFNOTENEND C (1,30,12) = [O"0000"]; 
        END 
  
      ARRAY RBFSTARTED  S(3); 
        BEGIN 
        ITEM RBFSTARTMSG  C(0,0,6)    = ["START "]; 
        ITEM RBFVERS      C(0,36,13)  = [RBFVER]; 
        ITEM RBFLVL       C(1,54,5)   = [RBFLV];
        ITEM RBFZR        U(2,24,12)  = [0];
        END 
  
      ARRAY NETONOK S(2); 
        BEGIN 
        ITEM NETONOKMSG C (00,00,15) = ["NETON ACCEPTED."]; 
        ITEM NETONOKEND U (01,30,12) = [O"0000"]; 
        END 
  
      ARRAY RBFENDED S(2);
        BEGIN 
        ITEM RBFENDEDMSG C (0,0,10) = ["RBF ENDED."]; 
        ITEM RBFENDEDEND U (1,0,12) = [O"0000"];
        END 
  
      ARRAY BADSTART S(4);
        ITEM BADSTARTMSG C (0,0,35) = 
                ["RBF NOT STARTED PROPERLY, USE N.RBF"],
             BADSTARTEND U (4,30,12) = [O"0000"]; 
  
      ARRAY DUPLICATE S(4); 
        ITEM DUPLICATEMSG C (0,0,30) =
                ["ANOTHER RBF ALREADY NETTED ON "], 
             DUPLICATEEND U (3,0,12) = [O"0000"]; 
  
      STATUS NETONSTATUS  OK, 
                          NO$NAM, 
                          DUPL$RBF, 
                          NOT$ENABLED;
      ITEM NETONSTATES S:NETONSTATUS; 
# 
      LOCAL PARAMETERS
# 
      ITEM ROLL$EP U = O"400000000000000";
      ITEM I I; 
      ITEM J U; 
      ITEM NRFLFN = O"16220634000000000000";  # NETWORK RELEASE FILE   #
      DEF  RBFNAME   #"RBF"#; 
  
# 
   SET UP FIRST WORD TO ROLLOUT 
      ALSO INVOKE RBF PROCESSING OF CIO ERRORS
# 
      ROLLFWA = B<42,18>MEMORY[O"101"] + ROLL$EP; #CIO ERR BIT ON#
      ROLLADR = LOC (ROLLRTN);
  
      KVERSION[0] = RBFVER; # RBF VERSION NO. TO K-DISPLAY DATA AREA   #
      KLEVEL[0]   = RBFLV;  # PSR LEVEL NO. TO K-DISPLAY DATA AREA     #
# 
      SET UP PARAMETERS FOR THE CPM CONSOLE FUNCTION AND EXECUTE IT 
# 
      KZEROFIELD[0] = 0;
      KADDRINPUT[0] = LOC(RBFKINP); 
      KADDRRIGHT[0] = LOC(RBFKDS);
      KADDRLEFT [0] = KADDRRIGHT[0];
      SYSCALL("CPMP", CONSOLE + LOC(CPMPARAM[0]));
# 
      ISSUE RBF STARTED MESSAGE TO THE DAYFILE VIA DFLMSG, BUT FIRST
      USE OPTION 2 OF THE MSG FUNCTION.  THIS WILL ERASE THE MESSAGE
      ISSUED BY THE ABOVE CPM FUNCTION TO LINE 2 OF THE CONTROL POINT.
# 
      SYSCALL("MSGP", MSGLINE2 + LOC(RBFSTARTED));
      MESSAGE (RBFSTARTED,DFLOPT);
*IF -DEF,NOQAC
# 
      CHECK THAT RBF WAS PROPERLY BROUGHT UP
# 
      I = CHKSSID;            # CHECK RBF"S SUBSYTEM ID                #
# 
      IF RBF"S SUBSYSTEM ID WAS NOT THAT WHICH WOULD HAVE BEEN GIVEN TO 
      IT, IF IT HAD BEEN PROPERLY BROUGHT UP WITH A "RBF" OPERATOR
      TYPEIN, ISSUE THE DAYFILE ERROR MESSAGE.
# 
      IF I EQ 0 
      THEN                   # STOP RBF BECAUE OF IMPROPER STARTUP     #
        BEGIN 
        MESSAGE(BADSTART,DFLOPT); 
        ENDRBF; 
        END 
*ENDIF
      MC = 0;                # INITIALIZE FOR NO MC CONTROL CARD PARAM #
# 
      PROCESS RBF"S CONTROL CARD PARAMETERS 
# 
      CTRLCDP;
# 
      ATTEMPT TO NET ONTO THE NETWORK 
# 
      NETTEDON = FALSE; 
      IF MC NQ 0
      THEN                   # MC PARAMETER WAS SPECIFIED ON CONTROL CD#
        BEGIN 
        NETREL(NRFLFN,0,0);    # WRITE JOB RECORD TO NETWORK LOG FILE  #
        END 
      FOR I = I WHILE NOT NETTEDON DO 
        BEGIN # NETON # 
        NETON ("RBF",NSUP,NETONSTATES,1,STATIONS + TOTDEV); 
        SWITCH NETON$:NETONSTATUS   NETON$OK:OK,
                                   NETON$END:NO$NAM,
                                  NETON$DUPL:DUPL$RBF,
                                NETON$DISABL:NOT$ENABLED; 
        GOTO NETON$ [NETONSTATES];
          BEGIN # NETON STATES #
      NETON$OK:              # NET ON ACCEPTED                         #
          NETTEDON = TRUE;
          MESSAGE(NETONOK,DFLOPT);
          TEST; 
      NETON$DUPL:            # NET ON REJECTED, DUPLICATE APPLICATION  #
          MESSAGE(DUPLICATE,DFLOPT);
          ENDRBF; 
      NETON$DISABL:          # RNF NOT ENABLED                         #
          MESSAGE(RBFNOTENABL,DFLOPT);
          ENDRBF; 
      NETON$END:  
          SYSCALL("RCL",0); 
          END   # NETON STATES #
        END    # NETON #
 #
          CHECK CHARACTER SET 
 #
      IF ISC63(I) GQ ZERO 
      THEN
        BEGIN                                    # 63-CHARACTER MODE   #
        C<X"25",1>TB8T6 = " ";                   # HEX 25 IS A BLANK   #
        C<X"3A",1>TB8T6 = ":";                   # HEX 3A IS A COLEN   #
        END 
# 
      INITIALISE BUFFER MANAGER 
# 
# 
      PLACE TSBINIT CODE IN THE INI OVERLAY SPACE 
# 
      TSBINIT;
#    INITIALIZE GLOBAL ITEMS
# 
      RBFBSN = ZERO;
      IDLESHUTDOWN = FALSE; 
      SRHTIME = SEARCHTIME; 
      ENABLECFO;
# 
      INITIALIZE ACN$TABLE
# 
      FOR I = 1 STEP 1 UNTIL UPPER$ACN DO ACN$WORD [I] = 0; 
# 
      SET UP CHAIN TABLES 
# 
      FOR I = 1 STEP 1 UNTIL CHAINS"BACKGROUND" DO
        BEGIN 
        CHN$NENTRIES [I] = 0; 
        CHN$FIRST [I] = 0;
        CHN$OVLIN [I] = FALSE;
        CHN$ENTRYPT [I] = 0;
        CHN$NEXTCHN [I] = I + 1;
        CHN$LAST [I] = 0; 
        END 
# 
 THE FOLLOWING SEQUENCE FORMS THE LINK BETWEEN A MODULE AND THE UNIQUE
 OVERLAY THAT IT RESIDES IN.
# 
      CHN$PRIMARY [CHAINS"SMP$"] = O"01"; 
      CHN$SECOND [CHAINS"SMP$"] = O"02";
      CHN$PRIMARY [CHAINS"CMD$"] = O"01"; 
      CHN$SECOND [CHAINS"CMD$"] = O"03";
      CHN$PRIMARY [CHAINS"EXT$CMD"] = O"01";
      CHN$SECOND [CHAINS"EXT$CMD"] = O"04"; 
      CHN$PRIMARY [CHAINS"DIS$"] = O"01"; 
      CHN$SECOND [CHAINS"DIS$"] = O"05";
      CHN$PRIMARY [CHAINS"DCM$"] = O"01"; 
      CHN$SECOND [CHAINS"DCM$"] = O"06";
      CHN$PRIMARY [CHAINS"UCM$"] = O"01"; 
      CHN$SECOND [CHAINS"UCM$"] = O"07";
      CHN$PRIMARY [CHAINS"NEW$"] = O"01"; 
      CHN$SECOND [CHAINS"NEW$"] = O"10";
      CHN$PRIMARY [CHAINS"CON$END"] = O"01";
      CHN$SECOND [CHAINS"CON$END"] = O"11"; 
      CHN$PRIMARY [CHAINS"FIN$CON"] = O"01";
      CHN$SECOND [CHAINS"FIN$CON"] = O"12"; 
      CHN$PRIMARY [CHAINS"FIN$DEV"] = O"01";
      CHN$SECOND [CHAINS"FIN$DEV"] = O"13"; 
      CHN$PRIMARY [CHAINS"QCM$"] = O"01"; 
      CHN$SECOND [CHAINS"QCM$"] = O"14";
      CHN$NEXTCHN [CHAINS"BACKGROUND"] = CHAINS"SMP$";
      CHN$ENTRYPT [CHAINS"BACKGROUND"] = LOC(WAIT); 
#                                                                      #
#     SET UP QCM CONTROL BLOCK                                         #
#                                                                      #
      ACN = QCBACN; 
      ACN$CB [ACN] = GETBUF (QCB$SIZE, NOT$MOVEABLE); 
      IF ACN$CB [ACN] EQ ZERO 
      THEN
        BEGIN                                    # BAD BUILD,CHECK FL  #
        MESSAGE (BADSTART, DFLOPT);              # OR BAD BUFFER MGR   #
        ENDRBF; 
        END 
# 
      PLACE QUEUE CONTROL MODULE ON EVENT CHAIN 
# 
      LINK (CHAINS"QCM$",LOC(QTEST)); 
# 
      SET UP SUPERVISORY MESSAGE CONTROL BLOCK
     #
      ACN = SMPACN; 
      ACN$CB [ACN] = GETBUF (TCB$SIZE, NOT$MOVEABLE); 
      IF ACN$CB [ACN] EQ ZERO 
      THEN
        BEGIN                                    # BAD BUILD,CHECK FL  #
        MESSAGE (BADSTART, DFLOPT);              # OR BAD BUFFER MANAGE#
        ENDRBF;                                  #MENT PROGRAM         #
        END 
  
      ACN$STATE [ACN] =CONNECTSTATE"ACTIVE";
      LINK ( CHAINS"SMP$",LOC(WAITSM)); 
  
      I = 0;
      J = 0;
      P<ABH> = LOC (I); 
      P<SM$> = LOC (J); 
      ABH$ABT = BLOCKTYPE"SM";
      ABH$ACT = ACT"SIXTYBITS"; 
      ABH$TLC = 1;
      PFCSFC = X"C201"; 
      NETPUT (ABH,SM$);                          # TRUNCATE BLOCK SM   #
  
# 
     CALL SCHEDULER 
# 
      SCH;
      END   # INI # 
      TERM; 
