*DECK PILOAD
          IDENT  PILOAD 
**DOCK    TITLE  SPACE,4,10 
**DOCK    EJECT  4,10 
          TITLE  PILOAD - LOADER USER CALL INTERFACE ROUTINE. 
  
          ENTRY  LOADER.
  
**DOCK    TITLE  SOFT 
          SPACE  4
***       CONTROL DATA PROPRIETARY PRODUCT
*         COPYRIGHT CONTROL DATA CORP. - 1976, 1977, 1978, 1979, 1980,
*         1981, 1982. 
          SPACE  4
**        ********************************************* 
*         *PILOAD - LOADER USER CALL INTERFACE ROUTINE* 
*         *         FOR *CMM* USERS.                  * 
*         ********************************************* 
* 
* 
*         S. MALEK                 75/06/01.
*                            WRITTEN FOR CYBER LOADER V1.1
          SPACE  4
**               *PILOAD* IS THE INTERFACE BETWEEN USER CODE AND THE
*         USER-CALL LOADER (*LOADU*) FOR USE IN A *CMM* ENVIRONMENT.
*         THE MAIN RESPONSIBILITIES OF *PILOAD* ARE:  
* 
*         (1)    DETERMINATION OF THE ADDRESS AND LENGTH OF THE 
*                *LDREQ* BLOCK FOR USE BY *LOADU* 
*         (2)    VERIFICATION OF VALID FWA AND LWA OF THE LOADABLE
*                AREA, OR THE ASSIGNMENT OF SUCH AN AREA THROUGH *CMM*
*                IF NONE WAS PROVIDED 
*         (3)    DETERMINATION OF THE CURRENT CM AND ECS FIELD LENGTH 
*         (4)    LOADING AND STARTING UP *LOADU*
          SPACE  4
*CALL LDRCOM
          IPARAMS 
          SPACE  4
          IFMACS
          SPACE  4
 PILOAD   COMMENT L "LEVEL" LOADER CMM INTERFACE. 
          COMMENT COPYRIGHT CONTROL DATA CORP. 1976, 1977, 1978, 1979, 1
,980, 1981, 1982. 
          SPACE  4
**        + + + + + + + 
*         + PROCEDURE + 
*         + + + + + + + 
* 
* 
*         1)   ENTRY IS BY MEANS OF A RETURN JUMP.
* 
  
 LOADER.  SUBR   =           ENTRY
          SX6    B0                                                      LDR0234
          SA6    PAR+1       INITIALIZE PARAM LIST (CMM.GLF ADDRESS)     LDR0234
          SA1    LOADER.
          SB1    1
          LX1    30          (B4) = FWA OF PARAMETER AREA 
          SA3    X1-1 
          SB4    X3 
          SX6    X1          RETURN ADDRESS FOR *LOADU* 
          SA6    RET         SAVE RETURN ADDRESS
          MEMORY CM,MEM,RCL,B0
          SA4    MEM
          AX4    30 
          SA0    X4          (A0) = CM FL 
          MX1    3
          SA2    B4          GET 1ST WORD OF PARAMETER AREA 
          BX3    X1*X2       UPPER 3 BITS ARE SET IF NEW STYLE
          BX3    X1-X3
          ZR     X3,UC1      IF NEW-STYLE CALL
          SX7    MES5        (X7)=ADR OF ERROR MESSAGE
          EQ     ABT         *LDREQ BEGIN MISSING*
  
**        2)   THE LIMITS SPECIFIED FOR THE LOAD ARE CHECKED TO SEE IF
*              THEY WILL OVERWRITE THE USER-CALL PARAMETER AREA.  THIS
*              CONDITION IS ALLOWED, BUT IT MEANS THE USUAL REPLY 
*              INFORMATION WILL NOT BE AVAILABLE TO THE CALLING PROGRAM.
*              IF THIS IS THE CASE, THE PARAMETER AREA IS MOVED, IF 
*              NECESSARY, TO THE VERY TOP OF THE LOADABLE AREA, SO AS TO
*              AVOID ITS BEING CLOBBERED WHEN *LOADU* IS READ IN BY 
*              *LDV* IN A CASE IN WHICH IT WAS NEAR THE BOTTOM OF THE 
*              LOADABLE AREA. 
* 
  
 UC1      SB3    X2          (B3) = LWA+1 OF LOADABLE AREA
          AX2    30          (B2) = FWA OF LOADABLE AREA
          SB2    X2 
          MX0    -12         DETERMINE LWA+1 OF PARAMETER AREA
          SB5    B4+3 
          SB7    A0          (B7) = FIELD LENGTH
 UC2      SA1    B5          GET HEADER OF NEXT REQUEST 
          LX1    -36         (X2) = LENGTH OF THIS REQUEST
          BX2    -X0*X1 
          SX2    X2+B1
          SB5    B5+X2       ADVANCE FETCH ADDRESS
          ZR     X1,UC2A     IF *END* 
          LX1    -12
          BX1    -X0*X1      ISOLATE REQUEST TYPE 
          SX2    X1-CLAST-1 
          PL     X2,UC2A     IF ILLEGAL 
          SX2    X1-CEXECUTE
          ZR     X2,UC2A     IF *EXECUTE* 
          SX2    X1-CNOGO 
          ZR     X2,UC2A     IF *NOGO*
          LT     B5,B7,UC2   IF MORE WITHIN FL
          SX7    MES4 
          EQ     ABT         *LDREQ END MISSING*
  
 UC2A     RJ     LIM         PROCESS LIMITS 
          MX7    3           PLACE ACTUAL FWA AND LWA+1 OF
          SX1    B2          LOADABLE AREA IN REQUEST HEADER
          SX2    B3          IN CASE EITHER HAD BEEN = 0 BEFORE 
          LX1    30 
          BX3    X1+X2
          BX7    X7+X3
          SA7    B4 
  
**        3)   THE PPU PROGRAM *LDV* IS CALLED TO LOAD *LOADU*. 
* 
  
          MEMORY ECS,MEM,RCL,B0 
          SA3    MEM
          AX3    30 
          BX0    X3          (X0) = ECS FL
          SX2    B2          FWA
          SA1    LOADU       NAME OF LOADER OVERLAY 
          SX3    B3          LWA+1
          BX7    X1 
          SX4    140B        U-BIT, V-BIT 
          SA7    LDVCALL     STORE 1ST PARAM WORD 
          LX3    18          FORM 2ND PARAM WORD
          LX4    36 
          BX3    X2+X3
          BX7    X3+X4
          SX6    400B        (4,0) OVERLAY LEVEL NUMBERS                 LDR0223
          LX6    48                                                      LDR0223
          BX7    X6+X7                                                   LDR0223
          SX2    A7 
          SA7    A7+B1       STORE 2ND PARAM WORD 
          LOADREQ LDVCALL,R,DATA   CALL *LDV* TO LOAD *LOADU* 
          SA1    LDVCALL+1
          LX1    59-36       ERROR FLAG 
          SX7    MES2        SET MESSAGE ADDRESS
          NG     X1,ABT      IF FATAL ERROR 
  
**        4)   PARAMETERS EXPECTED BY THE MAIN LOADER PROGRAM *LOADU* 
*              ARE PLACED IN THE APPROPRIATE REGISTERS AS FOLLOWS:  
* 
*                   A0 - LWA+1 OF LOADABLE AREA.                         LDR0234
*                   X0 - BITS  0-29 - ECS FL. 
*                        BITS 30-59 - ADDRESS OF PARAM AREA FOR *LOADU*.
*                   B7 - FWA OF LOADABLE AREA.  THIS IS ALSO THE ADDRESS
*                        WHERE *LOADU* IS LOADED.  *LOADU* NEEDS IT IN
*                        ORDER TO RELOCATE ITSELF.
*                   X6 - BITS  0-17 - FWA OF USER-CALL PARAMETER AREA.
*                        BITS 18-35 - LWA+1 OF USER-CALL PARAMETER AREA.
*                        BITS 36-53 USER RETURN ADDRESS.
* 
  
          SA0    B3          (A0) = LWA+1 OF LOADABLE AREA               LDR0234
          LX1    36-59       *LOADU* ENTRY POINT RELATIVE TO 0
          SB7    B2          FWA OF LOADABLE AREA                        LDR0195
          SB2    B2+X1       ENTRY ADDRESS FOR *LOADU*                   LDR0195
          SX1    PAR         ADDRESS OF PARAM LIST FOR *LOADU*
          LX1    30 
          BX0    X1+X0
          SA1    RET         RETURN 
          SX6    B5          RQLWA
          SX7    B4          RQFWA
          LX1    36 
          LX6    18 
          BX6    X1+X6
          BX6    X6+X7
          JP     B2          START *LOADU*
  
  
**        5)   CONTROL RETURNS ONLY AFTER *LOADU* HAS COMPLETED THE 
*              REQUEST. UPON RETURN FROM *LOADU*, THE CM BLOCK IS 
*              SHRUNK TO REFLECT THE UNLOADING OF *LOADU*.
* 
*              PARAMETERS EXPECTED BY *PILOAD* ARE AS FOLLOWS:  
* 
*                   WORD 4 OF AREA STARTING AT LOCATION *PAR* CONTAINS
*              THE AMOUNT BY WHICH THE CM BLOCK IS TO BE REDUCED. 
*                   WORD 5 OF AREA STARTING AT LOCATION *PAR* CONTAINS
*              THE EXIT ADDRESS FOR *PILOAD*. 
  
 SFL      SA1    PAR+1
          ZR     X1,SFL1     IF *CMM* NOT USED
          SA1    FWA         GET FWA
          SA2    PAR+3       SHRINK COUNT 
          SB2    X1          SAVE FWA 
          RJ     =XCMM.SLF   SHRINK BLOCK TO LWA OF LOAD
          SX1    B2 
          SX2    B0          NEW BLOCK CHARACTERISTIC 
          RJ     =XCMM.CSF   CHANGE BLOCK TYPE
 SFL1     SA2    PAR+4       EXIT ADDRESS 
          SB2    X2 
          JP     B2          EXIT 
          SPACE  4,8
**        LIM - PROCESS LOAD LIMITS.
* 
*              IF THE USER-CALL PARAMETER AREA IS ANYWHERE WITHIN 
*         THE LOADABLE AREA, IT IS MOVED TO THE TOP OF THE LOADABLE 
*         AREA TO FACILITATE ITS BEING PICKED UP BY *LOADU* AND ALSO
*         TO MINIMIZE ITS CHANCES OF BEING OVERWRITTEN BY THE LOADING 
*         OF *LOADU*. 
* 
*         ENTRY  (B1) = 1.
*                (B2) = FWA OF LOADABLE AREA. 
*                (B3) = LWA+1 OF LOADABLE AREA. 
*                (B4) = FWA OF USER-CALL PARAMETER AREA.
*                (B5) = LWA+1 OF USER-CALL PARAMETER AREA.
*                (B7) = CM FIELD LENGTH.
*                (A0) = CM FIELD LENGTH.
*         EXIT   (B4) AND (B5) REFLECT THE NEW LOCATION OF THE USER-CALL
*                  PARAMETER AREA IF IT WAS MOVED.
*                (B2) = FWA OF LOADABLE AREA.                            LDR0195
*                (B3) = LWA+1 OF LOADABLE AREA.                          LDR0195
*         USES   X - 1, 2, 3, 4, 5, 6, 7. 
*                B - 4, 5, 6, 7.                                         LDR0195
*                A - 1, 2, 3, 4, 5, 6, 7. 
*         CALLS  MSG=, SYS=, CMM.ALF. 
  
  
 LIM      SUBR
          SX7    MES1        SET ERROR MESSAGE
          ZR     B2,LIM2     IF FWA NOT SPECIFIED 
          ZR     B3,ABT      IF LWA NOT SPECIFIED 
          SA1    RA+COMLDLWA
          SX2    X1 
          AX2    59          SIGN(DABA) 
          BX1    X2-X1
          SB6    X1          DABA 
          GE     B2,B6,LIM1  IF FWA ABOVE DABA
          LE     B6,B3,ABT   IF LWA BELOW DABA
 LIM1     GE     B2,B3,ABT   IF LWA NOT > FWA 
          LE     B3,B7,LIM3  IF LWA @ FL
  
*         ERROR EXIT.  (X7) = MESSAGE ADDRESS.
  
 ABT      MESSAGE X7,,R 
          ABORT 
  
 LIM2     NZ     B3,ABT      IF LWA SPECIFIED WITHOUT FWA 
          SX2    IP.UCBLK    BLOCK FOR *LOADU*
          SX3    300B        BLOCK SPECIFICATION (FPVS) 
          SB2    B4 
          SB3    B5          SAVE REGISTERS CLOBBERED BY *CMM*
          RJ     =XCMM.ALF   REQUEST BLOCK FROM *CMM* 
          SB4    B2          RESTORE REGISTERS CLOBBERED BY *CMM* 
          SB5    B3 
          SB2    X1 
          BX6    X1 
          SA6    FWA         SAVE FWA 
          SB3    B2+IP.UCBLK LWA
          SX6    =XCMM.GLF
          SA6    PAR+1       INDICATE CMM AVAILABLE TO *LOADU*
  
*         COMPARE LIMITS OF LOADABLE AREA WITH LIMITS OF USER-CALL
*         PARAMETER AREA. 
  
 LIM3     GE     B4,B3,LIM   IF PARAMETER AREA COMPLETELY ABOVE 
                                    LOADABLE AREA 
          GE     B2,B5,LIM   IF PARAMETER AREA COMPLETELY BELOW 
                                    LOADABLE AREA 
          GE     B5,B3,LIM   IF NOT NECESSARY TO MOVE PARAM AREA
  
*         MOVE PARAMETER AREA TO THE TOP OF THE LOADABLE AREA.
  
          SB7    B5-B4       (B7) = LENGTH OF PARAMETER AREA
          SB6    B1          (B6) = WORDS MOVED + 1 
 LIM4     SA1    B5-B6       MOVE TOP WORD FIRST
          BX6    X1 
          SA6    B3-B6
          SB6    B6+B1       SET FOR NEXT WORD
          GE     B7,B6,LIM4  LOOP 
          SB5    B3          ADJUST PARAMETER AREA LWA+1 AND FWA
          SB4    B3-B7
          EQ     LIM         EXIT 
          SPACE  4,8
 MEM      CON    0           ARG. FOR MEMORY CALLS
 FWA      CON    0           STORAGE FOR FWA
 RET      CON    0           RETURN ADDRESS FOR *LOADU* 
  
 PAR      VFD    42/0,18/=XLOD=    START OF PARAMETER AREA FOR
          CON    0                 COMMUNICATION WITH *LOADU* 
          VFD    42/0,18/SFL       RETURN ADDRESS FOR *LOADU* 
          CON    0,0         PARAMETERS SET BY *LOADU*
  
 LOADU    VFD    60/0LLOADU  NAME OF MAIN LOADER PROGRAM TO LOAD
 LDVCALL  BSSZ   2
  
 MES1     DATA   C*FWA-LWA ERROR ON LOADER USER CALL* 
 MES2     DATA   C*LDV ERROR LOADING LOADU* 
 MES4     DATA   C*LDREQ END MISSING* 
 MES5     DATA   C*LDREQ BEGIN MISSING* 
  
          END 
