          EJECT
          TITLE  LOADBC - FETCH BUFFER CONTROLWARE FROM NOS.
**        LOADBC - FETCH BUFFER CONTROLWARE FROM NOS.
*
*         CALL
*           LOADBC (CHANNEL, ^BUFFER, ^BUFFER_LENGTH, ^STATUS);


          ENTRY  LOADBC
 LOADBC   BSS    0
          RJ     ZSMRENT     DECODE PARAMETERS
          SB1    1
          RJ     GCN         GET CONTROLWARE NAME
          NZ     B5,LBC1     IF NAME NOT FOUND
          RJ     RCF         READ CONTROLWARE FILE
          NZ     B5,LBC1     IF CONTROLWARE NOT FOUND
          RJ     RPC         RE-PACKAGE CONTROLWARE
 LBC1     SX6    B5
          SA1    STATUS
          SA6    X1          SAVE STATUS
          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
 CWL      CON    0           CONTROLWARE LENGTH
 FWC      CON    0           FWA OF CONTROLWARE
 LWC      CON    0           LWA+1 OF CONTROLWARE
 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
 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
          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
**        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     BX6    X1
          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


**        TABLE OF CONTROLWARE TYPES.

 GCND     BSS    0
          LOC    0
          CON    0           0 - NO CONTROLWARE
          DATA   0LBCS       1 - HT (7054/7154/7152)
          DATA   0LBCF       2 - FT (7154/7152)
          DATA   0LFMD       3 - FMD (7155)
          DATA   0LADP       4 - FSC ADAPTER
          DATA   0LPHD       5 - DEMA/AFMD (7155-10)
          DATA   0L170       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
          BSS    CTALL
