*DECK     CSIBOF
USETEXT TEXTCS
USETEXT TEXTSS
      PROC CSIBOF;
# TITLE - BUILD OVERLAY FILE.                                          #
      BEGIN 
# 
**    CSIBOF - BUILD OVERLAY FILE.
* 
*     D.K. ENDO    82/06/15 
*     A. LIM       82/06/24 
* 
*     THIS PROCEDURE INITIALIZES THE OVERLAY FILE BY LOADING THEM AND 
*     THEN WRITING THEM TO FILE *OVLFILE*.
*     IT MOVES ALL THE CROSS REFERENCE TABLES NEEDED FOR THE OVERLAY
*     FROM THE MANAGED AREA TO BLANK COMMON BEFORE IT WRITES THE
*     OVERLAY OUT TO FILE *OVLFILE*.
* 
*     PROC CSIBOF 
* 
*     ENTRY        1. NONE. 
* 
*     EXIT         1. *OVLFILE* BUILT 
* 
# 
  
  
# 
****  PROC CSIBOF - XREF LIST BEGINS. 
# 
  
      XREF
        BEGIN 
        PROC MOVEI;          # MACREL - MOVE INDIRECT BLOCK OF CM WORDS#
        PROC RECALL;         # RETURNS CONTROL WHEN COMPLETE           #
        PROC REWIND;         # REWINDS A FILE                          #
        END 
  
# 
****
# 
  
  
      DEF CMP$NAM # O"03231403152000" #;       # CMD PROCESSOR (CSLCMP)#
      DEF CMR$NAM # O"03231403152200" #;       # CMD RECOGNIZER(CSLCMR)#
      DEF EVT$NAM # O"03231405262400" #;       # EVENT OVLY (CSLEVT)   #
      DEF OIO$NAM # O"03231417111700" #;       # OPERATOR I/O (CSLOIO  #
      DEF OSS$NAM # O"03231417232300" #;       # OPERATOR SUP (CSLOSS) #
  
      DEF XRFSIZ$    #   8 #;          # XRF SIZE = 4 TABLES X 2       #
  
  
      ITEM ADDLEN;           # ADDITONAL LENGTH TO ADD TO OVERLAY      #
      ITEM FWA;              # FIRST WORD ADDRESS TO LOAD THE OVERLAY  #
      ITEM I;                # LOOP INDUCTION VARIABLE                 #
      ITEM LENGTH     I;     # LENGTH OF OVERLAY TO BE LOADED          #
      ITEM TO         U;     # FWA OF MOVE TO BLOCK                    #
  
      ITEM ODTORD ;          # OVLY DEFINITION TABLE ORDINAL FOR EVLY  #
  
  
# 
      THIS ARRAY CONTAINS THE NAME OF THE OVERLAY TO BE LOADED. 
# 
      ARRAY OVN [00:00] S(1); 
        BEGIN 
        ITEM OVN$NAM    C(00,00,07);
        ITEM OVN$NUM    U(00,00,42);
        END 
  
  
# 
*     XRF - CROSS REFERENCE INFORMATION TABLE.
* 
*     THIS BASED ARRAY DEFINES THE POINTER WORD AND LENGTH PAIR 
*     OF EACH CROSS REFERENCE TABLE NEEDED BY ALL THE CS OVERLAYS.
*     IT ALWAYS POINTS TO THE LABELLED COMMON BLOCK OF BASED ARRAY
*     POINTER WORD AND LENGTH OF ALL CS CROSS REFERENCE TABLES, AND 
*     THIS BLOCK IS ALWAYS THE FIRST BLOCK  IN ANY OVERLAY. 
*     THIS TABLE MUST MATCH THE *CSXRF* DEFINITIONS IN *TEXTOV*.
*     ANY CHANGE TO THIS ARRAY OR TO *CSXRF* MUST CAUSE A COMPARABLE
*     CHANGE TO THE OTHER.  SERIOUS CIRCUMSTANCES MAY OCCUR OTHERWISE.
# 
  
      BASED ARRAY XRF[00:00] S(XRFSIZ$);
        BEGIN 
        ITEM XRF$DEX    U(00,00,60);   # DEVICE XREF TABLE             #
        ITEM XRF$DEXL   U(01,00,60);   # LENGTH OF DEX TABLE           #
        ITEM XRF$LIX    U(02,00,60);   # LINE XREF TABLE               #
        ITEM XRF$LIXL   U(03,00,60);   # LENGTH OF LIX TABLE           #
        ITEM XRF$LLXR   U(04,00,60);   # LOGICAL LINK XREF TABLE       #
        ITEM XRF$LLXRL  U(05,00,60);   # LENGTH OF LLXR TABLE          #
        ITEM XRF$PLXRF  U(06,00,60);   # PHYICAL LINK XREF TABLE       #
        ITEM XRF$PLXRFL U(07,00,60);   # LENGTH OF PLXREF TABLE        #
        END 
  
  
  
  
  
      CONTROL EJECT;
      PROC GET$OVL; 
# TITLE - GET OVERLAY.                                                 #
      BEGIN 
# 
*     GET$OVL - GET OVERLAY.
* 
*     D.K. ENDO    82/06/15 
* 
*     THIS PROCEDURE DOES AN INITIAL LOAD OF AN OVERLAY TO BE PREPARED
*     FOR WRITING TO THE OVERLAY FILE.
* 
*     PROC GET$OVL
* 
*     ENTRY        1. OVN$NAM[0] = OVERLAY NAME.
*                  2. ADDLEN  = ADDITIONAL LENGTH TO BE ADDED TO THE OVL
* 
*     EXIT         1. ODTORD  = OVERLAY DEFINITION TABLE ORDINAL FOR THE
*                                 OVERLAY LOADED. 
* 
# 
# 
*     PROC GET$OVL - XREF LIST BEGINS.
# 
      XREF
        BEGIN 
        PROC ABORT;          # CAUSES ABORT WHEN CALLED                #
        PROC LOADREQ;        # ISSUES LOAD REQUEST                     #
        PROC MESSAGE;        # SENDS MESSAGE TO THE DAYFILE            #
        PROC RECALL;         # RETURNS CONTROL WHEN COMPLETE BIT SET   #
        PROC SSTSDA;         # SET DYNAMIC ADDRESS                     #
        END 
# 
* 
# 
  
  
  
      ITEM DONE       B;     # MOVE MANAGED TABLES STATUS              #
      ITEM MEMSTAT    I;     # MEMORY REQUEST STATUS WORD              #
      ITEM NEED       I;     # TOTAL FIELD LENGTH NEEDED FOR LOAD      #
  
  
# 
      THIS ARRAY DEFINES THE MESSAGE SENT WHEN AN OVERLAY IS NOT FOUND. 
# 
      ARRAY ONF$TXT [00:00] S(3); 
        BEGIN 
        ITEM ONF$NAME   C(00,00,07);
        ITEM ONF$MSG    C(00,42,18) =[" OVERLAY NOT FOUND"];
        ITEM ONF$ZBYT   U(02,30,30) = [0];
        END 
  
  
# 
      THIS ARRAY DEFINES THE OVERLAY PARAMETER BLOCK USED BY
      LOADREQ TO MAKE THE LOAD REQUEST
# 
      ARRAY OPB [00:00] S(2); 
        BEGIN 
        ITEM OPB$NAME   C(00,00,07);
        ITEM OPB$WRD1   I(00,00,60);
        ITEM OPB$LLL    U(01,00,12);
        ITEM OPB$LO     B(01,17,01);
        ITEM OPB$OLF    B(01,18,01);
        ITEM OPB$LWA    U(01,24,18);
        ITEM OPB$FWA    U(01,42,18);
        ITEM OPB$WRD2   I(01,00,60);
        END 
      CONTROL EJECT;
#                                                                      #
#                            GET$OVL CODE BEGINS HERE                  #
#                                                                      #
# 
*     SEARCH THE 5400 TABLE FOR THE OVERLAY NAME. 
# 
      FOR ODTORD =0 STEP 1 WHILE OVN$NAM[0] NQ ODT$NAME[ODTORD ] AND
                                 ODTORD  LS EAC$DL[0]/2 
      DO
        BEGIN 
        END 
  
  
# 
*     IF FOUND, THEN GET THE OVERLAY. 
# 
      IF ODTORD  LS EAC$DL[0]/2 
      THEN
        BEGIN 
  
  
# 
*     COMPUTE THE SPACE NEEDED TO LOAD THE OVERLAY.  IF NOT ENOUGH ROOM,
*     THEN MOVE THE MANAGED TABLES UP TO MAKE ROOM.  SET THE OVERLAY
*     PARAMETER BLOCK.  LOAD THE OVERLAY. 
# 
        LENGTH = ODT$LWA[ODTORD ] - ODT$FWA[ODTORD ]; 
        NEED = FWA + LENGTH + ADDLEN; 
  
        IF NEED GQ MEMLOC 
        THEN
          BEGIN 
          SSTSDA(NEED,MEMSTAT,DONE);
          FOR LENGTH=LENGTH WHILE NOT DONE
          DO
            BEGIN 
            RECALL(MEMSTAT);
            SSTSDA(NEED,MEMSTAT,DONE);
            END 
          END 
  
        OPB$WRD1[0] = 0;
        OPB$WRD2[0] = 0;
        OPB$LLL[0] = ODT$LVL[ODTORD ];
        OPB$LO[0] =  LDI$LB[0]; 
        OPB$OLF[0] = TRUE;
        OPB$LWA[0] = NEED;
        OPB$FWA[0] = FWA; 
        IF OPB$LO[0]
        THEN
          BEGIN 
          OPB$NAME[0] = OVN$NAM[0]; 
          END 
        ELSE
          BEGIN 
          OPB$NAME[0] =  LDI$NAME[0]; 
          END 
  
  
        LOADREQ(OPB); 
  
  
        ODT$LWA[ODTORD ] = ODT$LWA[ODTORD ] + ADDLEN; 
        END 
  
# 
*     IF OVERLAY IS NOT FOUND, SEND MESSAGE TO DAYFILE AND ABORT. 
# 
  
      ELSE
        BEGIN 
        ONF$NAME[0] = OVN$NAM[0]; 
        MESSAGE(ONF$TXT,0); 
        ABORT;
        END 
  
  
      RETURN;                # **** RETURN ****                        #
      END 
      CONTROL EJECT;
      PROC WRITOVL; 
# TITLE - WRITE OVERLAY.                                               #
      BEGIN 
# 
*     WRITOVL - WRITE OVERLAY.
* 
*     D.K. ENDO    82/06/16 
* 
*     THIS PROCEDURE WRITES A GIVEN OVERLAY OUT TO *OVLFILE* AND SAVES
*     THE RANDOM SECTOR ADDRESS FOR THAT OVERLAY. 
* 
*     PROC WRITOVL
* 
*     ENTRY        1. ODTORD  = OVLY DEFINITION TBL ORDINAL FOR OVERLAY.
* 
*     EXIT         1. OVERLAY WRITTEN TO FILE *OVLFILE*.
*                  2. RANDOM SECTOR ADDRESS IN ODT ENTRY. 
* 
# 
# 
*     PROC WRITOVL - XREF LIST BEGINS.
# 
      XREF
        BEGIN 
        PROC RECALL;         # RETURNS CONTROL WHEN COMPLETE BIT IS SET#
        PROC WRITER;         # FLUSHES CIO BUFFER AND WRITES EOR       #
        END 
# 
* 
# 
  
  
  
#                                                                      #
#                            WRITOVL CODE BEGINS HERE                  #
#                                                                      #
# 
*     POINT THE FET TO THE OVERLAY TO BE WRITTEN. 
# 
      OF$FIRST[0] = FWA;
      OF$IN[0] = FWA + (ODT$LWA[ODTORD ] - ODT$FWA[ODTORD ]); 
      OF$OUT[0] = FWA;
      OF$LIMIT[0] = OF$IN[0] + 1; 
  
  
# 
*     SAVE THE CURRENT RANDOM SECTOR ADDRESS. 
# 
      ODT$PRU[ODTORD ] = OF$CRI[0]; 
  
  
# 
*     WRITE THE OVERLAY OUT TO THE FILE.
# 
      WRITER(OVLFET,0); 
      RECALL(OVLFET); 
  
  
      RETURN;                # **** RETURN ****                        #
      END # WRITOVL # 
      CONTROL EJECT;
#                                                                      #
#                            CSIBOF CODE BEGINS HERE                   #
#                                                                      #
# 
*     POINT THE ODT BASED ARRAY TO THE OVERLAY ENTRIES IN THE 5400 TABLE
*     OF THE (0,0) OVERLAY.  CALCULATE THE LWA+1 OF THE (77,00)OVERLAY. 
*     INITALIZE THE OVLFILE FET.  INITIALIZE THE OVERLAY REQUEST COUNT
*     AND THE OVERLAY REQUEST TABLE.
# 
      P<LDRINFO> = O"64"; 
      P<EACPM> = O"100";
      P<ODT> = P<EACPM> + 8 + EAC$NEP[0]; 
  
  
      FOR I=0 STEP 1 WHILE ODT$LVL[I] NQ O"7700" AND
                           I LS EAC$DL[0]/2 
      DO
        BEGIN 
        END 
  
      IF I LS EAC$DL[0]/2 
      THEN
        BEGIN 
        FWA = ODT$LWA[I]; 
        END 
  
      OF$LFN[0] = "OVLFILE";
      OF$CODE[0] = 3; 
      OF$R[0] = TRUE; 
      OF$L[0] = OFSIZ$ - 5; 
      OF$CRI[0] = 1;
      OF$FIRST[0] = FWA;
      OF$IN[0] = FWA; 
      OF$OUT[0] = FWA;
      OF$LIMIT[0] = FWA + O"100"; 
  
      ORC = 0;
  
      FOR I=0 STEP 1 UNTIL NODT$
      DO
        BEGIN 
        ORT$WORD[I] = 0;
        END 
  
  
      SSOEOPW = CSWDF"SOEOP"; 
  
  
      REWIND(OVLFET); 
      RECALL(OVLFET); 
  
  
# 
*     GET THE EVENT OVERLAY.  CALCULATE THE TOTAL LENGTH NEEDED TO LOAD 
*     ITS CROSS REFERENCE TABLES, WHICH ARE: LIX, LLXR, AND 
*     PLXREF.  LOAD THE OVERLAY, THEN MOVE ONE TABLE AT A TIME TO THE 
*     END OF THE OVERLAY.  INITIALIZE THE POINTER ADDRESS AND LENGTH OF 
*     THE TABLE DEFINED IN LABELLED COMMON BLOCK *CSXRF*. 
*     THEN WRITE IT OUT THE OVERLAY FILE. 
# 
  
      OVN$NUM[0] = EVT$NAM; 
      ADDLEN = LIXLS + LLXREFLS + PLXREFLS; 
      GET$OVL;
      P<EAHPM> = FWA;            # POINT 5400 TABLE AT END OF 77,0 OVL #
      P<XRF> = FWA + 4 + EAH$NEP[0];   # POINT XRF TO LABELLED COMMON  #
  
      XRF$LIX[0] = LOADBASE + LENGTH;                # LIX TABLE       #
      XRF$LIXL[0] = LIXLS;
      TO = FWA + LENGTH;
      MOVEI(LIXLS, P<LIXS>, TO);
  
      XRF$LLXR[0] = XRF$LIX[0] + XRF$LIXL[0];        # LLXR TABLE      #
      XRF$LLXRL[0] = LLXREFLS;
      TO = TO + XRF$LIXL[0];
      MOVEI(LLXREFLS, P<LLXRS>, TO);
  
      XRF$PLXRF[0] = XRF$LLXR[0] + XRF$LLXRL[0];     # PLXRF TABLE     #
      XRF$PLXRFL[0] = PLXREFLS; 
      TO = TO + XRF$LLXRL[0]; 
      MOVEI(PLXREFLS, P<PLXREFS>, TO);
  
      WRITOVL;
  
# 
*     GET THE OPERATOR I/O OVERLAY.  WRITE IT OUT TO THE OVERLAY FILE.
# 
  
      OVN$NUM[0] = OIO$NAM; 
      ADDLEN = 0; 
      GET$OVL;
  
  
      WRITOVL;
  
  
# 
*     GET THE COMMAND RECOGNIZER OVERLAY.  WRITE IT OUT TO THE OVERLAY
*     FILE. 
# 
      OVN$NUM[0] = CMR$NAM; 
      ADDLEN = 0; 
      GET$OVL;
  
  
      WRITOVL;
  
  
# 
*     GET THE COMMAND PREPROCESSOR OVERLAY.  CALCULATE THE TOTAL LENGTH 
*     NEEDED TO LOAD ITS CROSS REFERENCE TABLES, WHICH ARE: DEX, LIX, 
*     LLXR, AND PLXREF.  LOAD THE OVERLAY.  THEN MOVE ONE TABLE 
*     AT A TIME TO THE END OF THE OVERLAY.  INITIALIZE THE POINTER
*     ADDRESS AND LENGTH OF THE TABLES DEFINED IN LABELLED COMMON 
*     BLOCK *CSXRF*.
*     WRITE THE OVERLAY OUT TO THE OVERLAY FILE.
# 
  
      OVN$NUM[0] =CMP$NAM;
      ADDLEN = DEXLS + LIXLS + LLXREFLS +  PLXREFLS;
      GET$OVL;
      P<XRF> = FWA + 4 + EAH$NEP[0];
  
      XRF$DEX[0] = LOADBASE + LENGTH;              # DEX TABLE         #
      XRF$DEXL[0] = DEXLS;
      TO = FWA + LENGTH;
      MOVEI(DEXLS, P<DEXS>, TO);
  
      XRF$LIX[0] = XRF$DEX[0] + XRF$DEXL[0];       # LIX TABLE         #
      XRF$LIXL[0] = LIXLS;
      TO = TO + XRF$DEXL[0];
      MOVEI(LIXLS, P<LIXS>, TO);
  
      XRF$LLXR[0] = XRF$LIX[0] + XRF$LIXL[0];      # LLXR TABLE        #
      XRF$LLXRL[0] = LLXREFLS;
      TO = TO + XRF$LIXL[0];
      MOVEI(LLXREFLS, P<LLXRS>, TO);
  
      XRF$PLXRF[0] = XRF$LLXR[0] + XRF$LLXRL[0];  # PLXRF TABLE      #
      XRF$PLXRFL[0] = PLXREFLS; 
      TO = TO + XRF$LLXRL[0]; 
      MOVEI(PLXREFLS, P<PLXREFS>, TO);
  
      WRITOVL;
  
  
# 
*     GET THE OPERATOR SUPERVISION OVERLAY.  WRITE IT OUT TO THE
*     OVERLAY FILE. 
# 
  
      OVN$NUM[0] = OSS$NAM; 
      ADDLEN = 0; 
      GET$OVL;
  
  
  
  
      WRITOVL;
  
# 
*     ZERO OUT THE LENGTH OF ALL CROSS REFERENCE TABLES IN
*     MANAGED AREA. 
# 
  
      DEXLS = 0;
      LIXLS = 0;
      LLXREFLS = 0; 
      PLXREFLS = 0; 
  
      RETURN;                # **** RETURN ****                        #
  
      END # CSIBOF #
  
      TERM
