*DECK     GMB 
          IDENT  GMB
          TITLE  GMB - GET MESSAGE BLOCK. 
          SST 
          SYSCOM B1 
  
  
          ENTRY  GMB
  
          COMMENT  GET MESSAGE BLOCK. 
          COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1994. 
          SPACE  4,10 
**        GMB - GET MESSAGE BLOCK.
* 
*         J. G. CLARK        80/02/06.
          SPACE  4,10 
**        COMMON DECKS. 
  
  
*CALL COMCMAC 
*CALL CMACROS 
*CALL COMCAPR 
*CALL COMCPTF 
 GMB      SPACE  4,10 
**               GMB RETURNS A DATA BLOCK OF TYPE MESSAGE TO THE
*         CALLER.  GMB IS CALLED WHEN THE NSUP WORD INDICATES 
*         THERE IS A SUPERVISORY/INPUT MESSAGE BLOCK READY. 
*         IF BOTH THE INPUT AND SUPERVISORY MESSAGE BITS ARE
*         SET, THE SUPERVISORY MESSAGE WILL BE RETURNED.
*         SUPERVISORY MESSAGES ARE CHECKED TO DETERMINE THE 
*         TYPE OF RESPONSE TO RETURN.  ERROR MESSAGES ARE 
*         RETURNED FOR VARIOUS ERROR CONDITIONS.  A CONNECTION
*         BROKEN IS ACKNOWLEDGED BY SETTING THE CONNECTION
*         STATUS INDICATOR TO BROKEN CONNECTION AND ABORTING. 
* 
*         ENTRY  (A1) IS THE ADDRESS OF THE PARAMETER LIST. 
* 
*         PARAMETER LIST
*         STAT   - COMMUNICATIONS STATUS INDICATOR. 
*                - SET TO -0 IF THE CONNECTION IS BROKEN. 
*         ACKT   - NETWAIT TIME INTERVAL. 
*         WAITF  - NETWAIT FLAG AS DEFINED BY NETWAIT.
*         HA     - HEADER AREA FOR DATA BLOCK.
*         TA     - TEXT AREA FOR DATA BLOCK.
*         MAXTLC - MAXIMUM TEXT AREA AVAILABLE FOR NETGET.
* 
*                (X6) IS POSITIVE IF ONLY INPUT IS AVAILABLE. 
* 
*         EXIT   (X1) CONTAINS AN ERROR MESSAGE ADDRESS IF A
*                NETWORK ERROR IS ENCOUNTERED.  ZERO IF NONE. 
*                (X6) IS +0 IF A NULL BLOCK OR BACK WAS RECEIVED. 
*                (X6) IS NEGATIVE IF A NAK WAS RECEIVED.
*                (X6) IS +1 IF INPUT WAS RECEIVED.
* 
*         USES   A - 1,2,3,6,7. 
*                B - 1,2. 
*                X - 1,2,3,4,5,6,7. 
* 
*         CALLS  ABT, COD=, NETGET. 
  
  
 GMB      SUBRL  (#STAT,,NGET,#HA,MB,MBL,FINR)
          SA1    "NGET" 
          PL     X6,GMB1     IF ONLY INPUT AVAILABLE
          SA1    "STAT"      FWA OF PARAMETER 
          RJ     GSM         GET SUPERVISORY MESSAGE
          EQ     GMBX        RETURN 
  
 GMB1     SX6    B1 
          SA6    X1 
          RJ     =XFTUGET    GET QUEUED INPUT 
          SA2    "HA"        GET HEADER WORD
          SB1    1
          NFETCH X2,ABHABT,B2  GET APPLICATION BLOCK HEADER 
          MX1    0
          SX6    B0 
          ZR     B2,GMB5     IF NULL BLOCK
          SX6    B1          ASSUME MSG BLOCK RECEIVED
          SB3    B2-6 
          EQ     B3,B1,GMB3  IF Q-MSG-TYPE BLOCK
          ZR     B3,GMB2     IF Q-BLK-TYPE BLOCK
          EQ     B2,B1,GMB2  IF BLK-TYPE BLOCK
          SB3    B2-B1
          EQ     B3,B1,GMB3  IF MSG-TYPE BLOCK
          BX6    X6-X6       ASSUME NO DATA RECEIVED
          SX1    GMBA        SET ERROR (INVALID BLOCK TYPE) 
          EQ     GMB5        RETURN WITH ERROR
  
 GMB2     SA1    "STAT"      FWA OF PARAMETER 
          RJ     PSI         PROCESS SUBSEQUENT INPUT 
          NZ     X1,GMB5     IF ERROR 
 GMB3     SA2    "HA" 
          SB1    1
          NFETCH X2,ABHIBU,X6 
          SX1    BTLM 
          NZ     X6,GMB5     IF BLOCK TOO LARGE 
          SX6    1
          MX1    0           SET FOR NORMAL RETURN
 GMB5     SA2    NGET 
          SA3    "NGET" 
          BX7    X2 
          SA7    X3          RESET NETWAIT FLAG 
          EQ     GMBX        RETURN WITH BUFFER STATUS
  
  
 GMBA     DATA   C* INCORRECT APPLICATION BLOCK TYPE.*
 PSI      SPACE  4,20 
**        PSI - PROCESS SUBSEQUENT INPUT. 
* 
*         PSI FORMS A SINGLE APPLICATION MESSAGE BLOCK BY COMBINING 
*         TEXTS OF ONE OR MORE CONTINUED BLOCKS (TYPE 1 OR 6) WITH TEXT 
*         OF THE FINAL BLOCK (TYPE 2 OR 7). 
* 
*         PROCESS.
*         WHILE APPLICATION BLOCK TYPE = 1 OR 6 (CONTINUED BLOCK) 
*           CALL *FTUGET* (NETGET) TO FETCH NEXT MESSAGE BLOCK. 
*             TEMPORARY FTUGET PARAMETERS - 
*               ACN = 1 
*               HEADER = LWA+2 OF PREVIOUS TEXT.
*               TEXT AREA = HEADER + 1. 
*               MAX TEXT LENGTH = MAX - PREVIOUS LENGTH.
*           IF NULL BLOCK 
*             CALL WMB
*             IF SUPERVISORY MESSAGE
*               CALL GSM
*           ELSE
*             CALL *MDT* TO APPEND NEW TO PREVIOUS TEXT.
*         RESET PRIMARY FTUGET HEADER - ABT = LAST BLOCK TYPE.
*                                     - TLC = TOTAL CHARACTERS. 
* 
*         ENTRY  (FIRST CONTINUED MESSAGE BLOCK RECEIVED).
*                (X2) = APPLICATION BLOCK HEADER. 
*                (A1) = FWA OF PRIMARY PARAMETER LIST.
* 
*         EXIT   (FINAL MESSAGE BLOCK RECEIVED).
*                (A1) = FWA OF PRIMARY PARAMETER LIST.
*                (X1) = 0 IF NO ERROR 
*                     = ADDR OF ERROR MESSAGE.
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                A - 1, 2, 3, 4, 6. 
*                B - 1, 2, 3, 4, 6, 7.
* 
*         CALLS  FTUGET, GSM, MDT, WMB. 
* 
*         MACROS NFETCH, NSTORE.
  
  
 PSI      SUBR               ENTRY/EXIT 
          SX6    A1          SAVE PARAMETER LIST ADDRESS
          SA6    PSIA 
          MX4    -1 
          IX6    X6+X4       QBIT PARAMETER ADDR
          SA6    PSIE        SAVE FOR WMB FWA OF PARAMETER LIST 
          BX6    X1          *STAT* PARAMETER ADDRESS 
          SA6    PSIJ        SAVE IN GSM PARAMETER LIST 
          NFETCH X2,ABHTLC,X6 
          SA6    PSID        SAVE TOTAL CHARACTERS
 PSI1     LX6    3           MULTIPLIED BY 8
          SA4    "MB"        FWA OF BUFFER
          SB6    X4 
          SX4    60          LOCATE LWA OF INPUT
          BX3    X6 
          IX7    X6/X4
          SX6    X7+B6       LWA OF DATA
          BX4    X6 
          SA6    PSIB 
          SX6    60          CALCULATE REMAINING BITS 
          IX7    X6*X7
          IX6    X3-X7
          SA6    PSIC        SAVE REMAINING BITS
  
*         SET *FTUGET* PARAMETERS.
  
          SX6    X4+2        FWA OF NEW TEXT AREA 
          SA6    PSIF+2      NETGET *TA* PARAMETER
          SX4    B6          FWA OF BUFFER
          IX6    X6-X4       WORDS IN USE 
          SA2    MBL
          IX6    X2-X6
          SA6    PSII        NETGET *TLMAX* PARAMETER 
 PSI2     SA1    PSIF        *NETGET* PARAMETER BLOCK 
          RJ     =XFTUGET 
          SX2    PSIH        HEADER WORD
          SB1    1           RESTORE (B1) 
          NFETCH X2,ABHIBU,X6 
          SX1    BTLM        BLOCK TOO LARGE
          NZ     X6,PSIX     IF BLOCK UNDELIVERABLE 
          NFETCH X2,ABHTLC,X6 
          MX1    0
          ZR     X6,PSI3     IF NULL BLOCK
          SA3    PSID        GET NUMBER OF CHARACTERS 
          IX6    X6+X3
          SA6    A3          SAVE TOTAL CHARACTERS
          IX6    X6-X3       RESTORE CURRENT
          LX6    3           MULTIPLIED BY 8
          SB4    X6          TOTAL NUMBER OF BITS IN SOURCE 
          SB6    60          NUMBER OF BITS PER WORD
          SB3    B0          BEGINNING BIT POSITION IN SOURCE 
          SA1    PSIF+2      FWA OF NEW TEXT AREA 
          SA2    PSIB        LWA OF PREVIOUS TEXT 
          SA3    X1          FWA OF SOURCE
          SA1    X2          FWA OF DESTINATION 
          SA2    PSIC        NUMBER OF BITS LEFT
          SB2    X2 
          SB7    A1 
          RJ     MDT         MOVE DATA
          SX2    PSIH        HEADER WORD
          NFETCH X2,ABHABT,B2 
          SB3    B1+B1
          SA3    PSID 
          EQ     B2,B3,PSI4  IF MSG BLOCK 
          SB3    7
          EQ     B2,B3,PSI4  IF Q-MSG-TYPE BLOCK
          BX6    X3 
          EQ     PSI1        CONTINUE WITH NEXT BLOCK 
  
*         WAIT FOR NETWORK TO RESPOND.
  
 PSI3     SA1    PSIE 
          SA1    X1          FWA OF PARAMETER LIST
          RJ     =XWMB       WAIT MESSAGE BLOCK 
          NZ     X1,PSIX     IF ERROR 
          PL     X6,PSI2     GET INPUT DATA 
          SA1    PSIJ        TEMPORARY PARAMETER LIST 
          RJ     GSM         PROCESS POSSIBLE SUPERVISORY 
          ZR     X1,PSI3     IF NO ERROR
          EQ     PSIX        POSSIBLE ERROR 
  
 PSI4     SX2    PSIH 
          NSTORE X2,ABHTLC=X3  RESET CHARACTER COUNT
          SA1    X2 
          SA2    "HA" 
          BX6    X1 
          SA1    PSIA        RESTORE PRIMARY PARAMETER LIST 
          SA6    X2          REPLACE HEADER 
          SA1    X1 
          SX6    B1 
          MX1    0
          EQ     PSIX        RETURN 
  
  
 PSIA     BSSZ   1           ADDRESS OF PRIMARY PARAMETER LIST
 PSIB     BSSZ   1           LWA OF INPUT DATA
 PSIC     BSSZ   1           NUMBER OF BITS LEFT IN LWA OF INPUT DATA 
 PSID     BSSZ   1           TOTAL NUMBER OF CHARACTERS 
 PSIE     BSS    1           ADDR OF *WMB* PARAMETER LIST 
 PSIF     VFD    60/PSIG     *FTUGET* PARAMETER LIST  (ACN) 
          VFD    60/PSIH                              (HA)
          BSS    1                                    (TA)
          VFD    60/PSII                              (TLMAX) 
          VFD    60/0 
 PSIG     CON    1           ACN = 1 (GET MESSAGE BLOCK)
 PSIH     BSSZ   1           HEADER WORD
 PSII     BSS    1           TLMAX
 PSIJ     VFD    60/**       *STAT* 
          VFD    60/PSIK
          VFD    60/PSIK+1   NGET FLAG
          VFD    60/PSIK+2   HEADER WORD
          VFD    60/PSIL     DATA AREA
          VFD    60/PSIM     BUFFER LENGTH
          VFD    60/PSIK+3   FINR FLAG
 PSIK     BSSZ   4           GSM PARAMETER LIST 
 PSIL     BSSZ   11          SUPERVISORY MESSAGE BUFFER 
 PSIM     CON    *-PSIL      BUFFER LENGTH
 MDT      SPACE  4,15 
**        MDT - MOVE DATA.
* 
*         ENTRY  (A1)/(X1) = DESTINATION ADDRESS. 
*                (A3)/(X3) = SOURCE ADDRESS.
*                (B2) = NUMBER OF BITS IN DESTINATION.
*                (B3) = BEGINNING BIT POSITION IN SOURCE. 
*                (B4) = TOTAL NUMBER OF BITS TO MOVE. 
*                (B7) = DESTINATION ADDRESS.
*                (B6) = NUMBER OF BITS PER WORD.
* 
*         USES   X - 0, 1, 3, 6, 7. 
*                A - 3, 6, 7. 
*                B - 2, 3, 4, 5, 6, 7.
  
  
*         MOVE SOURCE DATA TO DESTINATION ON WORD BOUNDARY. 
  
 MDT4     BX7    X3 
          SB4    B4-B6
          SA7    B7 
          SA3    A3+B1       NEXT WORD
          SB7    B7+1 
          GT     B4,MDT4     IF MORE DATA TO MOVE 
  
 MDT      SUBR               ENTRY/EXIT 
          LE     B4,MDTX     IF NO DATA TO MOVE 
          NZ     B2,MDT1     IF MOVE TO MIDDLE OF WORD
          ZR     B3,MDT4     IF MOVE FROM BEGINNING OF WORD 
 MDT1     SB2    B2-B1
          MX0    1
          SB4    B4+B2
          ZR     B3,MDT2     IF MOVE FROM BEGINNING OF WORD 
  
*         MOVE SOURCE DATA FROM MIDDLE OF WORD
*         TO DESTINATION ON WORD BOUNDARY.
  
          SB2    B6-B3
          SB2    B2-B1
          LX1    B3,X3
          SB3    B0+
          SA3    A3+B1       NEXT WORD
  
*         MOVE SOURCE DATA FROM WORD BOUNDARY 
*         TO MIDDLE OF DESTINATION WORD.
  
 MDT2     AX4    B2,X0
          SB2    B2+B1
          BX7    X4*X1
          SB5    B6-B2
 MDT3     LX3    B5,X3       MERGE TO LAST PORTION
          BX6    -X4*X3 
          BX7    X6+X7
          SA7    B7 
          BX7    X4*X3       REMAINDER
          SB7    B7+B1
          SB4    B4-B6
          SA3    A3+B1       NEXT WORD
          GT     B4,B2,MDT3  IF MORE DATA TO MOVE 
          LE     B4,MDTX     IF COMPLETED 
          SA7    B7          MOVE LAST WORD 
          EQ     MDTX        RETURN 
 GSM      SPACE  4,20 
**        GSM - GET SUPERVISORY MESSAGE.
* 
*         ENTRY  (A1) = FWA OF THE PARAMETER LIST.
* 
*         EXIT   (X1) = 0 IF NO ERROR.
*                     = ADDRESS OF ERROR MESSAGE, OTHERWISE.
* 
*         USES   X - 1, 2, 3, 4, 5, 6, 7. 
*                A - 1, 2, 3, 6, 7. 
*                B - 1, 2.
* 
*         CALLS  COD=, FTUGET.
* 
*         MACROS NFETCH.
  
  
 GSM      SUBRL  (#STAT,,NGET,#HA,MB,,FINR) 
          SA1    "NGET" 
          BX6    X6-X6
          SA6    X1          SET ACN TO ZERO
          RJ     =XFTUGET    GET THE SUPERVISORY MESSAGE
          SA2    "HA" 
          SB1    1
          NFETCH X2,ABHIBU,X6 
          SX1    BTLM 
          NZ     X6,GSM5     IF NOT ENOUGH ROOM FOR MESSAGE 
          NFETCH X2,ABHABT,X6 
          MX1    0
          SX2    X6-3        *CMD* BLOCK TYPE 
          ZR     X6,GSM5     IF NULL BLOCK RECEIVED 
          SX1    ISMM        *INVALID SUPERVISORY MESSAGE*
          NZ     X2,GSM5     IF BLOCK TYPE NEITHER *NULL* NOR *CMD* 
          SA2    "MB" 
          NFETCH X2,PFCSFC,X3 
          NFETCH 0,FCACK,X4 
          BX4    X3-X4
          ZR     X4,GSM2     IF BACK RECEIVED 
          NFETCH 0,CONCB,X4 
          MX6    -0 
          BX4    X3-X4
          SX5    ACBM        SET *CONNECTION BROKEN*
          ZR     X4,GSM7     IF CONNECTION BROKEN 
          NFETCH 0,FCBRK,X4 
          BX6    X3-X4
          ZR     X6,GSM6     IF *FC/BRK/R* RECEIVED 
          NFETCH 0,SHUINS,X4
          MX1    0
          BX6    X3-X4
          ZR     X6,GSM8     IF SHUTDOWN MESSAGE
          NFETCH 0,FCINA,X4 
          BX6    X3-X4
          ZR     X6,GSM5     IF FC/INACT RECEIVED 
  
 HOP      EQU    0#D0        HOP PFC
  
          SX6    X3-HOP*256  CHECK FOR HOST OPERATOR MESSAGE
          AX6    8           IGNORE SFC 
          ZR     X6,GSM5     IF HOST OPERATOR MESSAGE 
          NFETCH 0,ERRLGL,X4
          BX6    X3-X4
          NZ     X6,GSM1     NOT LOGICAL ERROR
          SX1    ERLG        * ERR/LGL RECEIVED FROM RHF.*
          EQ     GSMX        EXIT WITH ERROR SET
  
 GSM1     NFETCH 0,FCNAK,X4 
          SX1    ISMM        *INVALID SUPERVISORY MESSAGE*
          MX6    0
          BX3    X3-X4
          NZ     X3,GSM5     IF NOT BLOCK NOT ACK 
          SX1    BNAM 
          SA3    MB 
          NFETCH X2,FCABN,X5
          BX7    X3 
          SA4    ABN         CHECK RECEIVED BLOCK NUMBER
          SA7    X2          RESET FIRST WORD OF MESSAGE BLOCK
          BX3    X4-X5
          MX6    -1 
          ZR     X3,GSM4     IF NAK WAS FOR LAST BLOCK SENT 
          SX6    B1 
          EQ     GSM3        FORCE AN ERROR (NAK NOT FOR LAST BLOCK)
  
 GSM2     SA4    ABN         CHECK BLOCK NUMBER RECEIVED WITH SENT
          NFETCH X2,FCABN,X5
          MX6    0           SET BACK RECEIVED STATUS 
 GSM3     MX1    0
          IX3    X4-X5
          PL     X3,GSM4     IF BLOCK NUMBER RECEIVED IS OKAY 
          SX1    ISMM 
          EQ     GSM5        EXIT WITH ILLEGAL SUPERVISORY ERROR
  
 GSM4     SX7    X5+B0
          SA7    ABNACKD     SET THE BLOCK NUMBER LAST RECEIVED 
          MX1    0
 GSM5     SA2    NGET 
          SA3    "NGET" 
          BX7    X2 
          SA7    X3          RESET NETWAIT FLAG 
          EQ     GSMX        RETURN WITH BUFFER STATUS
  
 GSM6     NFETCH X2,RC,X1 
          RJ     =XCOD=      CONVERT THE REASON CODE
          SX1    1R.         SET MESSAGE TERMINATOR 
          LX6    59-17
          LX1    41-5        POSITION NUMBER AND TERMINATOR 
          MX7    18 
          BX6    X7*X6
          BX7    X1+X6       MERGE END OF MESSAGE 
          MX6    -0 
          SA7    ABEM+3      SET *FC/BRK RECEIVED* MESSAGE
          SX5    ABEM        SET *FC/BRK RECEIVED* MESSAGE
 GSM7     SA1    "STAT" 
          SA2    NGET 
          SA3    "NGET" 
          SA6    X1          SET NETTED ON WITH NO CONNECTION 
          BX7    X2 
          SA7    X3          RESET NETWAIT FLAG 
          SA4    "FINR" 
          MX1    0
          SA4    X4          FETCH VALUE OF *FINI*
          SX6    B1 
          NZ     X4,GSMX     FINI RECEIVED
          BX1    X5 
          MX6    0
          EQ     GSMX        RETURN WITH ERROR MESSAGE
  
 GSM8     NFETCH X2,SHUTF,X4 CHECK SHUTDOWN TYPE
          SX3    B1 
          IX3    X3-X4
          SX1    NSHU        *NETWORK SHUTDOWN* 
          ZR     X3,GSM5     IF IMMEDIATE SHUTDOWN
          MX1    0
          EQ     GSM5        IGNORE MESSAGE 
  
          QUAL   *
          SPACE  4
          END 
