          IDENT  DSAFBCW
          SST
          SYSCOM B1
          LIST   F
          SPACE  4,10
          EXT    ZSMRRET,ZSMRENT,PARSV
          SPACE  4,10
          TITLE  DSA$FETCH~BUFFER~CONTROLWARE
**        LOADBC - FETCH BUFFER CONTROLWARE FROM NOS.
*
*         CALL
*           LOADBC (CHANNEL, ^BUFFER, ^BUFFER_LENGTH, ^STATUS);


          ENTRY  LOADBC
 LOADBC   BSS    0
          RJ     ZSMRENT     DECODE PARAMETERS
          SKIP   RA.MTR
          ERR    SYSCOM  NOT CALLED
          IF     DEF,RA.ORG,3
          MX7    0           LOADBC WAS CALLED BY CHANNEL NUMBER
          SA7    CALLFLG
          RJ     BCLOAD      READ CONTROLWARE FILE
          IF     -DEF,RA.ORG,3
          RJ     GCN         GET CONTROLWARE NAME
          NZ     B5,LBC1     IF NAME NOT FOUND
          RJ     RCF         READ CONTROLWARE FILE
          NZ     B5,LBC1     IF CONTROLWARE NOT FOUND
          SA1    CWI         GET CONTROLWARE INDEX
          SB2    X1
          SA1    CWNAME+B2   GET PACKING INFO
          SB2    X1
          RJ     RPC         RE-PACKAGE CONTROLWARE
 LBC1     SX6    B5
          SA1    STATUS
          SA6    X1          SAVE STATUS
          IF     -DEF,RA.ORG,1
          RETURN IN
          JP     ZSMRRET     RETURN TO CYBIL ROUTINE
 LOADBC   SPACE  4,10
**        FILE ENVIRONMENT TABLE.


 IN       BSS    0
 SYSTEM   RFILEB 0,5000,(FET=9)
 LOADBC   SPACE  4,10
**        CONTROL STORAGE CELLS.


 CHN      EQU    PARSV+0     CHANNEL NUMBER
 BUFA     EQU    PARSV+1     BUFFER ADDRESS
 BUFL     EQU    PARSV+2     BUFFER LENGTH
 STATUS   EQU    PARSV+3     STATUS
 CRN      CON    0           CONTROLWARE RECORD NAME LEFT JUSTIFIED
 CWI      CON    0           CONTROLWARE INDEX
 CWL      CON    0           CONTROLWARE LENGTH
 FWC      CON    0           FWA OF CONTROLWARE
 LWC      CON    0           LWA+1 OF CONTROLWARE
 RCF      SPACE  4,15


**        LOADBCN - FETCH BUFFER CONTROLWARE BY NAME FROM NOS.
*
*         CALL
*           LOADBCN (NAME, ^BUFFER, ^BUFFER_LENGTH, ^STATUS);


          ENTRY  LOADBCN
 LOADBCN  BSS    0
          RJ     ZSMRENT     DECODE PARAMETERS
          SA1    INDEX       GET CONTROLWARE INDEX
          SB2    X1
          SA1    B2+CWNAME   GET CORRESPONDING NAME
          MX7    42          MASK OUT NAME
          BX6    X1*X7
          SA6    CRN
          IF     DEF,RA.ORG,3
          SX7    B1          LOADBCN WAS CALLED BY NAME
          SA7    CALLFLG
          RJ     BCLOAD      READ CONTROLWARE FILE
          IF     -DEF,RA.ORG,1
          RJ     RCF         READ CONTROLWARE FILE
          NZ     B5,LBCN1    IF CONTROLWARE NOT FOUND
          SA1    INDEX
          SB2    X1
          SA1    B2+CWNAME   GET PACKING INFO
          SB2    X1
          RJ     RPC         RE-PACKAGE CONTROLWARE
 LBCN1    SX6    B5
          SA1    STATUS
          SA6    X1          SAVE STATUS
          IF     -DEF,RA.ORG,1
          RETURN IN
          JP     ZSMRRET     RETURN TO CYBIL ROUTINE
 LOADBC   SPACE  4,10
**        FILE ENVIRONMENT TABLE.


 LOADBCN  SPACE  4,10
**        CONTROL STORAGE CELLS.


 INDEX    EQU    PARSV+0     CONTROLWARE NAME
 CWNAME   BSS    0
          LOC    0
          CON    0
 ISD      VFD    42/0LISD,18/1
 CMD      VFD    42/0LCMD,18/0
 CM2      VFD    42/0LCM2,18/0
 MA464    VFD    42/0LMA464,18/1
 CW63X    VFD    42/0LCW63X,18/0
 BCS      VFD    42/0LBCS,18/1
 BCF      VFD    42/0LBCF,18/1
 FMD      VFD    42/0LFMD,18/1
 ADP      VFD    42/0LADP,18/1
 PHD      VFD    42/0LPHD,18/1
          LOC    *O

 CALLFLG  CON    0           =1 IF LOADBCN WAS CALLED BY NAME
*                            =0 IF LOADBC WAS CALLED BY CHANNEL NUMBER




 NOSSYS1  IF     -DEF,RA.ORG
 RCF      SPACE  4,15

**        RCF - READ CONTROLWARE FILE.
*
*         EXIT   (B5) = 0, IF VALID CONTROLWARE FILE READ.
*                (B5) .NE. 0, IF ERROR ENCOUNTERED.
*
*         USES   X - ALL.
*                A - 1, 2, 3, 6, 7.
*                B - 2, 3, 4, 5, 6.
*
*         MACROS ASSIGN, READ, REWIND, SKIPB, SKIPEI, STATUS.


 RCF      SUBR               ENTRY/EXIT

*         SET BUFFER POINTERS IN FET.

          SA2    BUFA        BUFFER ADDRESS
          SA3    A2+B1       BUFFER LENGTH
          SX6    X2
          SA1    IN+1        FIRST
          MX4    42
          SA3    X3
          BX7    X4*X1
          IX7    X2+X7
          SA6    A1+B1       STORE IN
          SA7    A1          STORE FIRST
          SA6    A6+B1       STORE OUT
          IX6    X6+X3
          SA6    A6+B1       STORE LIMIT

*         ASSIGN SYSTEM FILE.

          ASSIGN IN
          SKIPEI IN,R        POSITION TO EOI
          SKIPB  IN,2,R      POSITION TO BEGINNING OF DIRECTORY
          READ   IN,R        READ DIRECTORY
          SA1    X2+B1       FETCH BUFFER ADDRESS *FIRST*
          SA2    A1+B1       READ *IN* POINTER
          SB2    X1
          SA3    B2          LENGTH OF 7700 TABLE
          SB3    X2+         (B3) = LWA+1 OF DATA READ
          SA2    CRN
          LX3    24
          SB2    B2+X3       FIRST RECORD ON SYSTEM DIRECTORY
          MX7    42
 RCF1     SA1    B2+         READ DIRECTORY ENTRY
          LT     B2,B3,RCF2  IF NOT END OF DIRECTORY
          SB5    1           SET RESPONSE CODE
          EQ     RCFX        EXIT

 RCF2     BX3    X7*X1
          BX3    X3-X2
          NZ     X3,RCF3     IF CONTROLWARE NOT FOUND
          BX1    -X7*X1
          SX1    X1-10
          ZR     X1,RCF4     IF CONTROLWARE FOUND
 RCF3     SB2    B2+2
          EQ     RCF1        TEST IF NEXT ENTRY

 RCF4     SA1    A1+B1       SET RANDOM ADDRESS IN FET
          MX7    -29
          SA2    IN+6
          BX2    X7*X2
          BX6    -X7*X1
          BX6    X6+X2
          SA6    A2
          SA1    IN+2        RESET *IN* = *FIRST*
          SA2    IN+1
          MX7    -18
          BX2    -X7*X2
          BX1    X7*X1
          BX6    X1+X2
          SA6    A1

*         READ CONTROLWARE RECORD

          READ   IN,R        READ CONTROLWARE RECORD
          SA1    IN+2        READ *IN* POINTER
          SA2    A1+B1       READ *OUT* POINTER
          SB2    X2
          SA3    B2
          SB6    X1          SAVE *IN*
          MX0    12
          MX1    6           FORM 7700 MASK
          BX2    X0*X3
          SB5    2
          BX1    X1-X2
          NZ     X1,RCFX     IF NOT 7700 TABLE
          LX3    12
          BX2    X0*X3       LENGTH OF 7700 TABLE
          SB5    3
          LX2    12
          SB3    X2+B1
          SA2    B2+B3       READ EXPECTED 5200 TABLE
          SX3    5200B
          SX6    A2+B1       FWA OF CONTROLWARE
          SA6    FWC
          SB2    X6          *OUT* = FWA OF CONTROLWARE
          SX6    X2-1        SUBTRACT LENGTH OF 5200 TABLE
          SX7    A2
          IX7    X2+X7       ADD CONTROLWARE LENGTH
          SB4    X6
          BX2    X0*X2
          SA7    LWC         SAVE LWA+1 OF CONTROLWARE
          LX2    12
          BX2    X2-X3
          NZ     X2,RCFX     IF NOT 5200 TABLE
          SB6    B6-B2       *IN* - *OUT*
          SB6    B6-B4
          SB5    4
          NZ     B6,RCFX     IF CM WORD COUNT DOES NOT MATCH
          SB5    B0+
          SA6    CWL         SAVE CONTROLWARE LENGTH
          EQ     RCFX        EXIT
 NOSSYS1  ENDIF
 RPC      SPACE  4,10
**        RPC - REPACKAGE CONTROWARE.
*
*         ENTRY  (BUFA) = PLACE TO STORE CONTROLWARE.
*                (FWC) = FWA OF UNPACKED CONTROLWARE.
*                (CWL) = LENGTH OF CONTROLWARE IN WORDS.
*
*         EXIT   CONTROLWARE PACKED 8 IN 8.


 RPC      SUBR               ENTRY/EXIT
          NZ     B2,RPC2     IF REPACKAGING TO BE DONE
          SA1    CWL         GET CONTROLWARE LENGTH
          SA2    BUFL
          BX6    X1
          SA6    X2          RETURN LENGTH

          SB2    B0          PREPARE TO MOVE
          SA1    FWC         CONTROLWARE
          SA2    X1          TO BUFFER MINUS
          SA3    CWL         ITS HEADER
          SB3    X3
          SA3    BUFA
          SA1    X3
 RPC0     SA4    A2+B2       GET SOURCE
          BX6    X4
          SA6    A1+B2       REPLACE TO DESTINATION
          SB2    B2+1
          GT     B2,B3,RPCX  IF DONE
          EQ     RPC0

 RPC2     SA1    RPCA
          SA2    A1+B1
          BX6    X1
          BX7    X2
          SA6    GTN         PRESET GET NIBBLE
          SA7    A6+B1
          JP     GTN         ENTER CO-ROUTINES

 GTN      EQ     STN0        STORE NIBBLE
 STN      EQ     GTN0        GET NIBBLE
          EQ     GTN

 RPC1     SX2    0
          RJ     STN         STORE NIBBLE
          SB3    15
          LT     B5,B3,RPC1  WAIT UNTIL LAST WORD IS STORED
          SX6    B2
          SA1    BUFL
          SA6    X1          SAVE DATA LENGTH
          SB5    B0          EXIT WITHOUT ERROR
          EQ     RPCX        RETURN

 RPCA     EQ     STN0        INITIAL CO-ROUTINE ADDRESSES
          EQ     GTN0

*         CO-ROUTINE TO GET NIBBLES FROM UNPACKED CONTROLWARE.

 GTN0     SA2    FWC         START OF CONTROLWARE
          SA3    CWL         CONTROLWARE LENGTH IN WORDS
          SA2    X2-1
          SB3    X3
 GTN1     SB4    4           NUMBER OF 8 BIT BYTES IN WORD
          SA2    A2+B1
          SB3    B3-B1
          NG     B3,RPC1     IF END OF DATA
 GTN2     LX2    4
          RJ     STN         STORE NIBBLE
          LX2    4
          RJ     STN         STORE NIBBLE
          SB4    B4-B1
          LX2    4
          PL     B4,GTN2     IF MORE DATA IN WORD
          EQ     GTN1        FETCH NEXT WORD

*         CO-ROUTINE TO STORE NIBBLES INTO BUFFER.

 STN0     SA1    BUFA        ADDRESS OF BUFFER
          SB2    B0
          MX5    4
 STN1     SB5    15          NIBBLES IN PACKED WORD
          SX6    0
 STN2     RJ     GTN         GET NIBBLE
          BX7    X5*X2       ISOLATE NIBBLE
          BX6    X6+X7
          SB5    B5-B1
          LX6    4
          NZ     B5,STN2     IF MORE NIBBLES TO STORE
          SA6    X1+B2
          SB2    B2+B1
          EQ     STN1        CONTINUE
 GCN      SPACE  4,10
 NOSSYS2  IF     -DEF,RA.ORG
**        GCN - GET CONTROLWARE NAME.
*
*         EXIT   (B5) .NE. ZERO IF NAME NOT FOUND.
*                (B5) = 0 IF NAME OBTAINED.
*                (CRN) = CONTROLWARE RECORD NAME.
*
*         USES   X - 1, 2, 4, 5, 6, 7.
*                A - 1, 4, 5, 6, 7.
*                B - 2, 3, 4, 5, 7.
*
*         MACROS SYSTEM.


 GCN      SUBR               ENTRY/EXIT
          SA1    CBUF
          PL     X1,GCN5     IF TABLES ALREADY OBTAINED
          SYSTEM RSB,R,GCNC,0
          SA1    GCNB        GET FWA OF CHANNEL TABLES
          MX2    -18
          AX1    12
          SA4    GCNA
          BX3    -X2*X1
          SX3    X3+CTALL*2
          LX3    18          POSITION FWA OF CHANNEL TABLES
          BX6    X3+X4
          SA6    A4
          SYSTEM RSB,R,GCNA,0  READ CHANNEL TABLES
 GCN5     SA5    CHN         GET CHANNEL NUMBER
          SB2    B0
 GCN6     SX5    X5-5        DIVIDE BY 5 LOOP
          NG     X5,GCN7     IF DIVIDE COMPLETE
          SB2    B2+B1
          EQ     GCN6        CONTINUE DIVIDE

 GCN7     SB3    X5+6        SAVE BYTE INDEX FOR CONTROLWARE TABLE
          SA1    CBUF+B2
 GCN8     LX1    12
          SB3    B3-B1
          NZ     B3,GCN8     IF CHANNEL NOT IN CORRECT POSITION
          MX5    -4
          BX1    -X5*X1      GET CONTROLLER TYPE INDEX
          SB3    X1
          SA1    B3+GCND     GET CONTROLWORD RECORD NAME
          NZ     X1,GCN9     IF CONTROLWARE ON CHANNEL
          SB5    5
          EQ     GCNX        EXIT

GCN9      SB2    X1
          SX6    B2
          SA6    CWI         SAVE INDEX
          MX7    42          KEEP JUST NAME
          BX6    X1*X7
          SA6    CRN
          SB5    B0
 GCN11    EQ     GCNX        EXIT


 GCNA     VFD    12/0,12/CTALL,18/0,18/CBUF

 GCNB     CON    -1          TEMPORARY BUFFER
 GCNC     VFD    12/0,12/1,18/CHTP,18/GCNB
 NOSSYS2  ENDIF


**        TABLE OF CONTROLWARE TYPES.

 GCND     BSS    0
          LOC    0
          CON    0               0 - NO CONTROLWARE
          VFD    42/0LBCS,18/BCS 1 - HT (7054/7154/7152)
          VFD    42/0LBCF,18/BCF 2 - FT (7154/7152)
          VFD    42/0LFMD,18/FMD 3 - FMD (7155)
          VFD    42/0LADP,18/ADP 4 - FSC ADAPTER
          VFD    42/0LPHD,18/PHD 5 - DEMA/AFMD (7155-10)
          VFD    42/0L170,18/0   6 - CYBER 170 NAD
          CON    0               7 - UNUSED (NO CONTROLWARE)
          CON    0               10- UNUSED (NO CONTROLWARE)
          CON    0               11- UNUSED (NO CONTROLWARE)
          CON    0               12- UNUSED (NO CONTROLWARE)
          CON    0               13- UNUSED (NO CONTROLWARE)
          CON    0               14- UNUSED (NO CONTROLWARE)
          CON    0               15- UNUSED (NO CONTROLWARE)
          CON    0               16- UNUSED (NO CONTROLWARE)
          CON    0               17- UNUSED (NO CONTROLWARE)
          LOC    *O
 CBUF     CON    -1          CHANNEL TABLE BUFFER
          IF     -DEF,RA.ORG,1
          BSS    CTALL
 BCLOAD   TITLE  INTRODUCTION
 NOSSYS3  IF     DEF,RA.ORG
*****     BCLOAD - A CPU UTILITY PROGRAM TO BE USED TO DOWN LOAD
*                BINARY CONTROLWARE INTO A 7021, 7054, 7152, 7154,
*                7155, OR NETWORK ACCESS DEVICE (NAD) TYPE CONTROLLER.
*
*         AUTHOR - DIAGNOSTIC AND MAINTENANCE PROGRAMMING
*                  LARGE SYSTEMS DIAGNOSTICS
*                  CUSTOMER ENGINEERING DIVISION
*         MODIFIED BY NOS/BE DEVELOPMENT - 1980.
*         MODIFIED BY G.D. MELBY TO SUPPORT NAD CONTROLWARE LOADING -
*                MAY, 1981.
*         MODIFIED BY NOS/BE DEVELOPMENT TO SUPPORT NOS/BE DUAL STATE -
*                APRIL, 1984.
*
*                DESCRIPTION
*
*                -BCLOAD- IS A CENTRAL PROCESSOR PROGRAM WRITTEN IN THE
*                6000 COMPASS ASSEMBLY LANGUAGE.
*                FOR ALL TYPES OF CONTROLLERS DLL IS CALLED TO
*                FIND THE CONTROLER TYPE.
*
*                THIS VERSION IS STRONGLY SHORTENED AND MODIFIED TO
*                MEET THE REQUIREMENTS OF NOS/BE DUAL STATE.
*                IT READS CONTROLWARE INTO CM BUFFER AND DOES NOT
*                LOAD IT INTO THE CONTROLLER. ENGINEERING MODE IS
*                NOT NECESSARY.
*                THE CONTROLWARE WILL BE READ FROM FILE ZZZZZ04 INTO
*                CM BUFFER.
*
          SPACE  3
***              CONTROL POINT AND DAYFILE MESSAGES.
*
*                    - EQUIPMENT NOT FOUND IN THE EST.
*                         THE DEVICE SPECIFIED BY THE ADDRESS 30 CARD
*                         MUST HAVE AN EQUIPMENT STATUS TABLE ENTRY
*                         OR -BCLOAD- WILL ABORT.
*
*                    - FILE READ IS NOT O.S. CONTROLWARE.
*                         THE FILE READ DID NOT CONTAIN CONTROLWARE
*                         FOR AN OPERATING SYSTEM.
*
*                    - FILE READ IS NOT XXXX CONTROLWARE
*                         XXXX = 7021,7054,7154, OR 7155
*                         THE FILE READ DID NOT CONTAIN CONTROLWARE
*                         APPROPRIATE FOR THE CHANNEL SPECIFIED
*
 BCLOAD   TITLE  PARAMETER BUFFER DESCRIPTIONS
**
*         DESCRIPTION OF THE PARAMETER BUFFER AREA, PARS.
*
*                59      47      35      23   17   11   5    0
*                +-------+-------+-------+----+----+----+----+
*         PARS   *     DLL  *                  * PARS ADDRESS*   0
*                +--------------------------------------------
*         DLEA   *  * CH*                      * DLEA ADDRESS*   1
*                +-------------------------------------------+
*         DLEB   *                                 * ET    *C*   2
*                +--------------------------------------------
*
*         DESCRIPTION OF PARAMETER BUFFER AREA - PARS.
*
*         WORD 0 PARS
*                CONTAINS THE RA+1 REQUEST.  BYTES 0 AND 1 CONTAIN
*                THE PP PROGRAM NAME (DLL) LEFT JUSTIFIED. BYTES 3 AND
*                4 CONTAIN THE ADDRESS OF PARS RIGHT JUSTIFIED.
*         WORD 1 DLEA
*                CH=CHANNEL NUMBER IN BITS 48-53.  BYTES 3 AND 4 CONTAIN
*                THE ADDRESS OF DLEA.
*         WORD 2 DLEB
*                STATUS RESPONSE FROM DLL
*                OR
*                ET=EQUIPMENT TYPE REQUEST, IF BIT 11 SET.
*                   DLL RETURNS EQUIPMENT TYPE TO CALLING PROGRAM
*                   ONLY AND EXITS WITHOUT LOADING CONTROLWARE.
*                   SYSTEM ORIGIN OF CALLING PROGRAM OR ENGINEERING
*                   MODE IS NOT NECESSARY.
*                C =COMPLETE BIT (IF ETFLAG IS SET)
*
*         DESCRIPTION OF STATUS RESPONSES RETURNED TO BCLOAD BY DLL.
*
*         WORD DLEB:
*                BITS 36-47 CONTAIN A HARDWARE MNEMONIC (AY,AZ,AJ,MT OR
*                NT). BITS 23-25 CONTAIN THE CONTROLLER TYPE (1,2,3, OR
*                4). BIT 2 SET NONZERO IF CHANNEL NOT FOUND IN EST.
*                BIT 0 SET NONZERO WHEN DLL COMPLETED TASK.
*
*                   CONTROLLER TYPE (1, 2, 3, OR 4)
*                   1 - 7054, 2 - 7154, 3 - 7155, 4 - 7021.
          SPACE  3
 PARS     VFD    42/3LDLL,18/PARS
 DLEA     VFD    36/0,24/DLEB
 DLEB     VFD    60/0

 LDLPB    VFD    60/1000B          -LDL- PARAMETER BLOCK
 BCLOAD   TITLE  VALIDATE PARAMETER
 BCLOAD   SUBR
          SA1    CALLFLG
          NZ     X1,SYSLOAD      LOADBCN WAS CALLED BY NAME

*         VALIDATE CH PARAMETER

 REL1     SA1    CHN         GET CH PARAMETER (ORIGINAL BCLOAD EXPECTS
*                                CHANNEL NUMBER IN DISPLAY CODE LEFT
*                                JUSTIFIED. THIS MODIFIED CODE EXPECTS
*                                IT IN OCTAL RIGHT JUSTIFIED)
          ZR     X1,BADCARD  CH NOT SPECIFIED
          BX5    X1
          MI     X5,BADCARD  CH NOT NUMERIC
          SX4    X5-34B
          PL     X4,BADCARD  CH TOO LARGE
          SX3    X5-14B
          MI     X3,REL2     CH BETWEEN 0 AND 13
          SX4    X5-20B
          MI     X4,BADCARD  CH BETWEEN 14 AND 19,ERROR
 REL2     LX5    48          POSITION CH
          SA1    PARS+B1
          BX6    X5+X1       ADD IN CH
          SA6    A1          RESTORE

 BCLOAD   TITLE  CALL DLL
**        THE FOLLOWING ROUTINE WILL VALIDATE DLL ON NOS/BE.
*         DLL WILL BE CALLED TO CHECK THE EST FOR A DISK OR TAPE
*         CHANNEL AND/OR MAINTENANCE OPERATION.
*         BCLOAD WILL FORMAT THE CALL WORD *DLEA* AS FOLLOWS....
*
*         **CC,****,****,**AA,AAAA
*         CC IS A CHANNEL NUMBER  MNEMONIC, AND
*         AA,AAAA IS THE ADDRESS OF DLEB
*
*         BCLOAD SETS BIT 11 IN DLEB. THIS FLAGS THAT THE EQUIPMENT
*         TYPE SHOULD BE RETURNED ONLY AND THE BUFFER CONTROLWARE WILL
*         NOT BE LOADED INTO THE CONTROLLER.
*         IN CASE OF A NOS/VE TAPE UNIT THE CHANNEL # IS NOT IN THE
*         EST BUT IN THE URT, AND DLL SIGNALS -EQ NOT FOUND IN EST-.
*         THIS CONDITION IS RETURNED (WITHOUT ERROR) TO NOS/VE.
*         SIDE EFFECT: 66X UNITS CANNOT BE USED BY NOS/VE.
*
*         DLL WILL RETURN ITS PARAMETERS IN DLEB AS FOLLOWS....
*
*            2**0 SET   = DLL HAS COMPLETED EST SEARCH
*            2**1 CLEAR = EQUIPMENT FOUND IN EST
*            2**1 SET   = EQUIPMENT NOT FOUND IN EST
*            BITS 24-26 = CONTROLLER TYPE (1,2,3, OR 4)
*            BITS 36-47 = HARDWARE MNEMONIC


*CALLDLL  BSS    0                 ENTRY
          MX6    1                 SET ET BIT
          LX6    12
          SA6    DLEB
          SA3    PARS
          BX6    X3
          SYSTEM                   CALL DLL FOR VALIDATION
          RECALL DLEB
          SA1    DLEB
          LX1    58
          PL     X1,SYSLOAD        IF EQUIPMENT FOUND
          SB5    5
          EQ     LBC1
          SPACE  3
**        BADCARD - ISSUE PARAMETER ERROR MESSAGE AND ABORT

 BADCARD  MESSAGE LBKPAR,,R
          EQ     ABT
 BCLOAD   TITLE  CHECK CONTROLWARE SOURCE

**        SYSLOAD - READ THE SYSTEM FIRMWARE INTO CENTRAL AND CHECK.
*
 SYSLOAD  BSS    0
          CLOSE  ZZZZZ04,RETURN,RCL GET RID OF ANY EXISTING FILE
          SA1    LDLPB             LDL PARAMETER BLOCK
          MX0    59
          BX6    X0*X1             CLEAR COMPLETE BIT
          SA6    A1
          SYSTEM LDL,RCL,LDLPB     CALL LDL TO BUILD FNT FOR ZZZZZ04
          SA1    CALLFLG
          ZR     X1,SYSLD3         LOADBC WAS CALLED BY CHANNEL NUMBER
          SB4    4                 NUMBER OF NOS/BE CONTROLLER TYPES
          SA1    CRN               CONTROLWARE NAME
          MX0    18
          BX5    X0*X1
 SYSLD1   SX4    B4
          SA3    GCND+B4           CHECK CONTROLWARE NAME
          BX6    X0*X3
          IX7    X5-X6
          ZR     X7,SYSLD2         CONTROLLER TYPE FOUND
          SB4    B4-B1
          GT     B4,SYSLD1
          EQ     CKCWERR           CONTROLLER TYPE NOT FOUND
 SYSLD2   BX6    X4                SAVE CONTROLLER TYPE
          LX6    24
          SA6    DLEB
          EQ     SYSLD4
 SYSLD3   MX0    -3                LOADBC WAS CALLED BY CHANNEL NUMBER
          SA4    DLEB
          LX4    36
          BX4    -X0*X4            CONTROLLER TYPE
 SYSLD4   SX4    X4-1              OFFSET
          SA4    CONPART+X4
          MX0    18
          BX4    X0*X4             CONTROLWARE DECKNAME
*
 SYSLD5   SA1    ZZZZZ04
          RJ     SETFET            SET UP FET POINTERS
          READSKP ZZZZZ04,,RCL
          SX2    10B               CHECK FOR EOF
          BX1    X2*X1
          SB4    B0                ZERO INDEX INTO MESSAGE ARRAY.
          NZ     X1,CKCWERR        NOT FOUND
*
          SA2    BUFA              OVERLAY NAME
          SA2    X2
          MX0    18
          BX2    X0*X2
          BX2    X2-X4
          NZ     X2,SYSLD5         WRONG RECORD
*
*         CORRECT CONTROLWARE FOUND
*
          SX6    A2+B1             RESET ADDRESS OF BINARY
          BX1    X6
          SA6    FWC               TO SKIP OVERLAY NAME
          SA2    ZZZZZ04+2         LWA+1 (IN POINTER)
          BX7    X2                SAVE LWA+1
          SA7    LWC
          IX6    X2-X6
          SA6    CWL               SAVE LENGTH OF CONTROLWARE

          RJ     SAVEPN            SAVE PART AND VERSION NUMBERS
          SB4    X1
          SX4    B4-B1             CONTROLLER TYPE OFFSET
          SA4    CONPART+X4
          MX0    -21
          BX4    -X0*X4
          SA2    VERSION
          IX5    X2-X4
          SB5    B0
          ZR     X5,BCLOADX
 CKCWERR  SX4    B4
          LX4    2                 MULTIPLY BY 4 TO GET MESSAGE INDEX
          MESSAGE (X4+LEMSG),,R
 ABT      BSS    0
 OPL      XTEXT  SSYS
          SFCALL EXIT,R
          MX6    0
          SA6    RA.SSID
          ABORT
 EXIT     CON    SF.EXIT
          CON    0
*                MESSAGES AND CONTROLWARE IDENTIFICATION
 LEMSG    DIS    ,*FILE READ IS NOT O.S. CONTROLWARE.*
 NDMSG    DIS    ,*FILE READ IS NOT 7054 CONTROLWARE.*
 NFMSG    DIS    ,*FILE READ IS NOT 7154 CONTROLWARE.*
 NFMDMSG  DIS    ,*FILE READ IS NOT 7155 CONTROLWARE.*
 NTMSG    DIS    ,*FILE READ IS NOT 7021 CONTROLWARE.*
          IFEQ   *-NTMSG,4,4
          IFEQ   NTMSG-NFMDMSG,4,3
          IFEQ   NFMDMSG-NFMSG,4,2
          IFEQ   NFMSG-NDMSG,4,1
          IFNE   NDMSG-LEMSG,4,1
P         ERR    MESSAGE LENGTH OR SEQUENCE ERROR.

 CONPART  EQU    *                 CONTROLWARE DECKNAME AND NUMBER
 CON710A  VFD    18/3L0SY,42/1610012B     7054 CONTROLWARE
 CON401A  VFD    18/3L0SZ,42/1000032B     7154 CONTROLWARE
 CON721A  VFD    18/3L0SJ,42/1620032B     7155 CONTROLWARE
 CON434A  VFD    18/3L0MT,42/1030112B     7021 CONTROLWARE

 LBKPAR   DIS    ,* CHANNEL NUMBER  ERROR    *
*
          SPACE  4,8
          EJECT
**        SAVEPN SAVE CONTROLWARE VERSION AND PART NUMBER
*                THE LAST TWO WORDS OF THE CONTROLWARE BINARY CONTAIN
*                THE CONTROLWARE PART NUMBER AND VERSION NUMBER. THE
*                FORMAT OF THESE WORDS FOR THE 7021 AND 7X54 BINARY IS:
*
*                            59    47    35    23    11     0
*                            +-----+-----+-----+-----+------+
*                WORD 3145B  *     *     *     AAAAAA       *
*                            +------------------------------+
*                WORD 3146B  * BB  *    CCCC   *            *
*                            +------------------------------+
*
*                     AAAAAA = UPPER 36 BITS OF THE PART NUMBER
*                     BB = LOWER 12 BITS OF THE PART NUMBER
*                     CCCC = VERSION NUMBER
*                THE FORMAT FOR THE 7155 CONTROLWARE BINARY IS:
*
*                            59    47    35    23    11     0
*                            +-----+-----+-----+-----+------+
*                WORD 5513B  *                       *  XX  *
*                            +------------------------------+
*                WORD 5514B  *     YYYYYY      *     ZZZZ   *
*                            +-------------------------------
*
*                     XX = UPPER 12 BITS OF THE PART NUMBER
*                     YYYYYY = LOWER 36 BITS OF THE PART NUMBER
*                    ZZZZ = VERSION NUMBER
*
*         ENTRY  X1 = FIRST WORD ADDRESS OF CONTROLWARE BINARY
*
*         EXIT   X1 = CONTROLLER TYPE
*                EPN = PART NUMBER
*                VERSION = VERSION NUMBER
*
*         USES   X0,X1,X2,X3,X4,X5,X6
*                A1,A2,A3,A4,A6
*                B1,B4
*

 SAVEPN   SUBR
          SA4    CWL
          SB4    X4                CONTROLWARE LENGTH
          SB4    B4-B1             OFFSET FOR LAST WORD
          SA3    X1+B4             CONTROLWARE VERSION
          MX0    -3
          SA1    DLEB
          LX1    36
          BX1    -X0*X1            CONTROLLER TYPE
          SX5    X1-3              SET TO ZERO IF 7155
          ZR     X5,SAVEPN1        SKIP SHIFT IF 7155
          AX3    24D               RIGHT JUSTIFY VERSION NUMBER
 SAVEPN1  MX0    -21D              MASK OUT VERSION
          BX2    -X0*X3
          BX6    X2
          SA6    VERSION           SAVE
          AX3    24                SHIFT OFF VERSION
          SA2    A3-B1             CONTROLWARE LAST WORD - 1
          ZR     X5,SAVEPN3        JUMP IF 7155
*
*         A3 CONTAINS THE LAST BYTE OF THE PART NUMBER RIGHT JUSTIFIED.
*         A2 CONTAINS THE UPPER 3 BYTES OF THE PART NUMBER RIGHT
*         JUSTIFIED.
*
          LX2    24
          AX2    24                REMOVE UNUSED BITS
          LX2    12                UPPER BYTES
          IX2    X2+X3             ADD LOWER BYTE
          EQ     SAVEPN5
*
*         A3 CONTAINS THE LOWER 3 BYTES OF THE PART NUMBER RIGHT
*         JUSTIFIED.  A2 CONTAINS THE UPPER BYTE OF THE PART NUMBER
*         RIGHT JUSTIFIED.
*
 SAVEPN3  MX0    60-12
          BX2    -X0*X2            REMOVE UNUSED BITS
          LX2    36                SHIFT
          IX2    X2+X3             ADD LOWER BYTES
 SAVEPN5  BX6    X2
          SA6    EPN               SAVE PART NUMBER
          EQ     SAVEPN
          SPACE  4,10
**        SETFET SET UP IN AND OUT POINTER IN FET
*         ENTRY  A1 = FET ADDRESS
*                X1 = CONTENTS OF WORD 1 OF THE FET
*
*         USES   A1,A2,A3,A6,A7
*                X0,X2,X3,X6,X7
*                B1
*

 SETFET   SUBR
          SA2    BUFA
          SX6    X2          START OF BUFFER
          SA2    A1+B1             FIRST POINTER
          MX0    42
          BX7    X0*X2
          BX7    X7+X6
          SA7    A2                NEW 2ND WORD OF FET
          SA6    A7+B1             NEW IN POINTER
          SA6    A6+B1             NEW OUT POINTER
          SA3    BUFL
          SA2    A6+B1
          SA3    X3
          IX6    X6+X3
          BX7    X0*X2
          BX7    X7+X6
          SA7    A2                NEW LIMIT
          MX3    16
          LX3    18
          BX6    -X3*X1
          SA6    A1                CLEAR CODE AND STATUS
          EQ     SETFET

 ZZZZZ04  FILEB  BUFIN,90
 EPN      DATA   0           EQUIP + PART NUMBERS FROM CW BINARY
 VERSION  DATA   0                 CW BINARY VERSION
 BUFIN    EQU    *
 NOSSYS3  ENDIF
          END
