GMSG
          IDENT  GMSG 
          TITLE  GET M860 MESSAGE AND ASSOCIATED DATA.
          ENTRY  GMSG 
          ENTRY  GDATA
          SST 
*COMMENT GET M860 MESSAGE AND ASSOC. DATA.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          SYSCOM B1 
 GMSG     SPACE  4
***       GMSG - GET M860 MESSAGE AND ASSOCIATED DATA.
* 
*         W. J. STURGIS.     82/09/14.
* 
*         GMSG GETS A M860 MESSAGE AND VERIFIES THE CHECKSUM. 
*         THE MESSAGE UNPACKED AND RETURNED TO THE CALLER ALONG 
*         WITH A STATUS.  ENTRY GDATA RETURNS AN ASSOCIATED DATA
*         BLOCK TO THE CALLER ALONG WITH A STATUS.
* 
*         SYMPL CALLS 
*         GMSG(FET,MSG,STS);
*         GDATA(FET,DATA,LEN,STS);
* 
*         WHERE 
*         FET = FET ASSRESS.
*         MSG = MESSAGE BUFFER(UPPER 48 BITS OF 11 WORDS) 
*         DATA = ASSOCIATED DATA BUFFER.
*         LEN = LENGTH OF ASSOCIATED DATA.
*         STS = RETURN STATUS.
*                0 = NORMAL COMPLETE. 
*                1 = CHECKSUM ERROR(GMSG ONLY). 
*                2 = NOT ENOUGH DATA IN BUFFER(BUFFER IS EMPTY).
          SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL,COMCMAC 
          TITLE  LOCAL MACROS.
**        UPACK - UNPACK ONE MESSAGE WORD.
* 
*         UNPACK SC 
* 
*         WHERE  SC = MASK AND SHIDT COUNT. 
  
  
          PURGMAC UNPACK
  
 UPACK    MACRO  SC 
          SA1    A1+B1       GET NEXT PACKED WORD 
          MX0    SC 
          BX2    X0*X1
          LX2    SC-48       POSITION TO LOWER OF PREVOIUS
          BX6    X6+X2
          SA6    B2          STORE UNPACKED WORD
          SB2    B2+B1
          BX6    -X0*X1      LOWER TO NEXT WORD 
          LX6    SC          LEFT JUSTIFY 
          ENDM
          TITLE  MAIN ROUTINES. 
 GMSG     SPACE  0
 GMSG     SUBR               ENTRY/EXIT 
          SB1    1
          SX7    A1 
          SA7    PARL        SAVE PARAMETER LIST
          SA0    X1          FET ADDRESS
          SB6    MBUF 
          SB7    9
          RJ     RDW         READ MESSAGE TO WORKING BUFFER 
          ZR     B7,GMS2     IF FULL MESSAGE
          SX6    2           FLAG PARTIAL OR NO MESSAGE 
 GMS1     SA1    PARL 
          SA1    X1+2 
          SA6    X1          STORE RESPONSE 
          EQ     GMSGX       RETURN 
  
 GMS2     SA1    PARL 
          SA1    X1+B1       CALLER MESSAGE BUFFER
          SB2    X1 
          SA1    MBUF-1      INITIALIZE A1
          SB3    0           LOOP COUNTER 
 GMS3     SA1    A1+B1
          MX0    48 
          BX6    X0*X1
          SA6    B2 
          SB2    B2+B1
          BX6    -X0*X1 
          LX6    48          LEFT JUSTIFY 
          UPACK  36 
          UPACK  24 
          UPACK  12 
          SA6    B2          STORE LAST WORD
          SB2    B2+B1
          SB3    B3+B1
          LE     B3,B1,GMS3 
          SA1    A1+B1
          MX0    32          ONLY 32 BITS IN LAST WORD
          BX6    X0*X1
          SA6    B2 
  
*         CHECKSUM MESSAGE
  
          SB3    B2-10       START OF MESSAGE 
          MX0    -16
          BX6    X6-X6       INITIAL CHECKSUM 
 GMS4     SA1    B3          MESSAGE WORD 
          LX1    16 
          BX2    -X0*X1 
          IX6    X6+X2
          LX1    16 
          BX2    -X0*X1 
          IX6    X6+X2
          LX1    16 
          BX1    -X0*X1 
          IX6    X6+X1
          SB3    B3+B1
          LE     B3,B2,GMS4  IF NOT ENTIRE MESSAGE
          BX6    -X0*X6      IGNORE OVERFLOW
          ZR     X6,GMS1     IF CHECKSUM CORRECT
          SX6    1           RETURN CHECKSUM ERROR STATUS 
          JP     GMS1        STORE STATUS AND RETURN
          EJECT 
 GDATA    SPACE  0
**        GDATA - GET ASSOCIATED DATA FROM BUFFER.
  
  
 GDATA    SUBR               ENTRY/EXIT 
          SB1    1
          SX7    A1 
          SA7    PARL        SAVE PARAMETER LIST POINTER
          SA0    X1          FET ADDRESS
          SA1    A1+B1
          SB6    X1          DATA BUFFER
          SA1    A1+B1
          SA1    X1 
          SB7    X1          LENGTH 
          RJ     RDW         MOVE DATA TO BUFFER
          SX6    B7          REMAINDER WORD COUNT 
          ZR     X6,GDA1     IF ALL DATA
          SX6    2           SET NOT FULL BLOCK STATUS
 GDA1     SA1    PARL 
          SA1    X1+3 
          SA6    X1          STORE RESPONSE 
          EQ     GDATAX      RETURN 
          TITLE  SUBROUTINES. 
 RDW      SPACE  4
**        RDW - READ WORDS TO WORKING BUFFER. 
* 
**               RDW READS A GIVEN NUMBER OF WORDS FROM A CIRCULAR
*         BUFFER TO A WORKING BUFFER.  RDW IS ADAPTED FROM RDW=(COMCRDW)
* 
*         ENTRY  (A0) = ADDRESS OF FET FOR FILE.
*                (B6) = FWA WORKING BUFFER. 
*                (B7) = WORD COUNT OF WORKING BUFFER. 
*                IF (B7) = 0, NO TRANSFER WILL BE PERFORMED.
* 
*         EXIT   (B7) = 0 FOR TRANSFER COMPLETE.
*                (B7) = REMAINING WORDS ON INCOMPLETE TRANSFER. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 1, 2, 3, 4, 5, 6, 7. 
*                A - 1, 2, 3, 4, 6, 7.
* 
*         CALLS  NONE.
  
  
*         PROCESS 1 WORD OR BUFFER EMPTY. 
  
 RDW18    ZR     B3,RDWX     IF NO DATA 
          BX7    X1          STORE 1 WORD 
          SA7    B6 
 RDW19    SX6    B4+B3       ADVANCE OUT
          SB4    B4+B3
          SB6    B6+B3
          SB7    B7-B3
          NE     B4,B5,RDW20 IF OUT " LIMIT 
          SA1    A0+B1       READ FIRST 
          SX6    X1          OUT = FIRST
 RDW20    SA6    A3          UPDATE OUT 
          NZ     B7,RDW1     IF NOT DONE
  
 RDW      SUBR               ENTRY/EXIT 
 RDW0     SX1    B0+
          LE     B7,RDWX     IF NO WORDS TO TRANSFER
 RDW1     SA3    A0+3        (B4) = OUT 
          SA1    A0+2        (B3) = IN
          SB1    1
          SA4    A3+B1       (B5) = LIMIT 
          SB4    X3 
          SB3    X1 
          SA1    X3          READ FIRST WORD
          SB5    X4 
          GE     B3,B4,RDW2  IF NO END AROUND 
          SB3    B5 
 RDW2     SB3    B3-B4       FREE DATA LENGTH 
          LE     B3,B7,RDW3  IF NOT ENOUGH ROOM 
          SB3    B7 
 RDWA     BSS    0
 RDW3     SA3    RDWB        PRESET CMU CODE
          RJ     RDW16       PRESET CMU CODE
*         LE     B3,B1,RDW18 IF 1 WORD OR LESS OF DATA (NO CMU) 
*         BX7    X1          (NO CMU) 
*         SA1    A1+B1       (NO CMU) 
* 
*         LE     B3,B1,RDW18 IF 1 WORD OR LESS OF DATA (CMU)
*         JP     RDW14       (CMU)
  
*         INITIALIZE REGISTERS FOR TRANSFER.
  
 RDW4     SX4    B3-B1
          MX6    -3 
          SA7    B6 
          BX3    -X6*X4      NUMBER OF ODD WORDS
          AX4    3           NUMBER OF BLOCKS 
  
*         TRANSFER UP TO 7 WORDS. 
  
          ZR     X3,RDW6     IF NO ODD WORDS
          SB2    X3 
 RDW5     SB2    B2-B1
          BX7    X1 
          SA1    A1+B1
          SA7    A7+B1
          NZ     B2,RDW5     IF MORE WORDS
  
*         PRE-READ REGISTERS. 
  
 RDW6     ZR     X4,RDW19    IF NO BLOCKS 
          SA2    A1+B1
          SB2    B1+B1       (B2) = 2 
          SA3    A2+B1
          SB4    X4          (B4) = LOOP COUNT
          SA4    A3+B1
  
*         TRANSFER 8 WORD BLOCKS. 
  
 RDW7     BX6    X1 
          LX7    X2 
          SA1    A3+B2
          SA2    A4+B2
          SA6    A7+B1
          SB4    B4-B1
          SA7    A6+B1
          BX6    X3 
          LX7    X4 
          SA3    A1+B2
          SA4    A2+B2
          SA6    A6+B2
          SA7    A7+B2
          BX6    X1 
          LX7    X2 
          SA1    A3+B2
          SA2    A4+B2
          SA6    A6+B2
          SA7    A7+B2
          BX6    X3 
          LX7    X4 
          SA3    A1+B2
          SA4    A2+B2
          SA6    A6+B2
          SA7    A7+B2
          NZ     B4,RDW7     LOOP 
  
*         READ EXIT.
  
          SA3    A0+3        OUT
          SA1    A3+B1       (B5) = LIMIT 
          SB5    X1 
 RDW8     SB6    B6+B3
          SB7    B7-B3
          SB4    X3+B3       ADVANCE OUT
          SX6    X3+B3
          SA1    A0+1        READ FIRST 
          NE     B4,B5,RDW20 IF OUT " LIMIT 
          SX6    X1+         OUT = FIRST
 RDW9     EQ     RDW20       CLEAN UP AND RETURN
  
*         MOVE DATA WITH CMU. 
  
 RDW14    SX4    B3-819 
          PL     X4,RDW15    IF MOVE TOO BIG FOR CMU
          SX4    B3          10 * WORDS = CHARACTERS
          LX6    X4,B1
          BX1    X0          SAVE X0
          LX4    3
          IX6    X4+X6
          SX7    B6          SET DESTINATION ADDRESS
          LX3    30 
          MX4    -4 
          BX7    X7+X3
          BX3    X4*X6       EXTRACT UPPER PORTION OF CHARACTER COUNT 
          LX3    48-4 
          BX4    -X4*X6 
          BX7    X3+X7
          LX4    26 
          BX7    X4+X7
          AX3    51 
          SA7    RDWB        STORE DESCRIPTOR WORD
          IM     RDWB        MOVE DATA
          BX0    X1          RESTORE X0 
          ZR     X3,RDW19    IF NO READ EXIT CHECK
          SX3    B4          SET OUT
          JP     RDW8 
  
 RDW15    BX7    X1 
          SA1    A1+B1
          JP     RDW4 
  
*         PRESET FOR CMU. 
*         RDWB IS READ UP AND THEN RETURN JUMPED TO IN ORDER TO VOID
*         THE INSTRUCTION STACK.
  
 RDWB     LE     B3,B1,RDW18  IF 1 WORD OR LESS (CMU) 
          JP     RDW14
  
 RDW16    EQU    RDWB        USED TO VOID STACK AT PRESET 
  
*         PRESET FOR CMU. 
  
          SA4    CMUR        CHECK IF CMU AVAIALABLE
          SB3    RDWA 
          NG     X4,RDW17    IF CMU 
          SA3    RDWC 
 RDW17    BX6    X3 
          SA6    B3 
          JP     RDW1 
  
 RDWC     LE     B3,B1,RDW18  IF 1 WORD OR LESS (NO CMU)
          BX7    X1 
          SA1    A1+B1
          TITLE  WORKING STORAGE. 
*         WORKING STORAGE.
  
  
 PARL     BSS    1           PARAMETER LIST POINTER 
 MBUF     BSS    9           MESSAGE BUFFER 
          SPACE  4
          END 
