IDENT SMSG TITLE SMSG - SEND MESSAGE TO M860. ENTRY SMSG SST *COMMENT PACK AND CHECKSUM M860 MESSAGE. COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1992. SYSCOM B1 SMSG SPACE 4 *** SMSG - SEMD MESSAGE AND ASSOCIATED DATA TO M860. * * W. J. STURGIS. 82/09/14. * * SMSG CHECKSUMS AND PACKS THE MESSAGE AND MOVES * IT TO THE MESSAGE BUFFER. ASSOCIATED DATA(IF ANY) * IS ALSO MOVED TO THE MESSAGE BUFFER. THE IN POINTER * IS UPDATED IN THE FET ONLY AFTER ALL DATA IS IN THE * BUFFER. * * SYMPL CALL. * SMSG(FET,MSG,ADATA,ADATAL,STS); * * WHERE * FET = FET ADDRESS. * MSG = MESSAGE(UPPER 48 BITS OF 11 WORDS). * ADATA = ASSOCIATED DATA BLOCK(0 IF NO DATA). * ADATAL = LENGTH OF ASSOCIATED DATA BLOCK(0 IF NONE). * STS = RETURN STATUS. * 0 = MESSAGE AND DATA IN BUFFER. * 1 = NOT ENOUGH ROOM IN BUFFER FOR MESSAGE(AND DATA). SPACE 4,10 * COMMON DECKS. *CALL,COMCMAC TITLE LOCAL MACROS. ** PACK - PACK AND STORE ONE MESSAGE WORD * * PACK SC * * WHERE SC = MASK AND SHIFT COUNT. PURGMAC PACK PACK MACRO S SA1 A1+B1 LOAD MESSAGE WORD MX0 -S BX1 X7*X1 USE ONLY 48 BITS LX1 S BX2 -X0*X1 BX6 X6+X2 FINISH PACKED WORD SA6 B3 STORE PACKED WORD SB3 B3+B1 UPDATE BUFFER ADDRESS BX6 X0*X1 UPPER BITS OF NEXT WORD ENDM TITLE MAIN ROUTINE. SMSG SUBR ENTRY/EXIT SB1 1 SX7 A1 SA7 PARL SAVE PARAMETER LIST ADDRESS SA0 X1 FET ADDRESS SA2 A1+3 SA2 X2 ASSOC. DATA LENGTH SA1 A0+2 IN BX7 X1 SA7 IN SAVE IN POINTER FOR WTW SA3 A1+B1 OUT IX6 X3-X1 OUT-IN ZR X6,SMS0 IF IN = OUT PL X6,SMS1 IF OUT GT IN SMS0 SA1 A0+B1 FIRST SA3 A3+B1 LIMIT SX1 X1 SX3 X3 IX6 X6+X3 +LIMIT IX6 X6-X1 -FIRST = ROOM IN BUFFER SMS1 SX2 X2+9+1 ASSOC. DATA + PACKED MSG + 1 IX6 X6-X2 PL X6,SMS3 IF ROOM IN BUFFER SMS1.0 SX6 1 SET RETURN CODE SMS2 SA1 PARL SA2 X1+4 RESPONSE ADDRESS SA6 X2 STORE RETURN STATUS EQ SMSGX RETURN * COMPUTE CHECKSUM. SMS3 SA1 PARL SA2 X1+B1 SB2 X2 MESSAGE SB5 B2 MX0 16 SA2 B2+10 BX6 X0*X2 CLEAR CHECKSUM SA6 A2 SB3 B2+11 LX0 16 BX6 X6-X6 INITIAL SUM SMS4 SA1 B2 LX1 16 BX2 X0*X1 LX1 16 IX6 X6+X2 BX3 X0*X1 LX1 16 IX6 X6+X3 BX2 X0*X1 IX6 X6+X2 SB2 B2+B1 LT B2,B3,SMS4 BX6 X0*X6 ONLY 16 BIT SUM SX1 0#10000 IX6 X1-X6 2S COMPL. BX6 X0*X6 ONLY 16 BITS SA1 A1 LOAD LAST WORD OF MESSAGE LX6 16+12 BX6 X6+X1 SA6 A1 STORE CHECKSUM * PACK MESSAGE. SA1 B5-B1 MESSAGE - 1 MX7 48 SB2 0 SB3 MBUF SMS5 SA1 A1+B1 BX6 X7*X1 PACK 12 PACK 24 PACK 36 SA1 A1+B1 BX1 X7*X1 LX1 48 BX6 X6+X1 SA6 B3 STORE LAST WORD SB3 B3+B1 SB2 B2+B1 LE B2,B1,SMS5 IF NOT 8 WORDS PACKED SA1 A1+B1 BX6 X1 SA6 B3 STORE NINTH WORD SA2 PARL (X2) = FET ADDRESS SB6 MBUF SB7 9 RJ WTW MOVE DATA TO BUFFER SA1 PARL SA2 X1+2 ASSOC DATA BLOCK SA3 X1+3 LENGTH SA3 X3 NZ X3,SMS7 IF ASSOC DATA SMS6 SA1 IN BX6 X1 SA6 A0+2 STORE IN POINTER IN FET JP SMSGX RETURN * MOVE ASSOCIATED DATA TO BUFFER SMS7 SB6 X2 WORKING BUFFER SB7 X3 LENGTH RJ WTW MOVE DATA EQ SMS6 UPDATE IN AND RETURN TITLE SUBROUTINES. WTW SPACE 4 ** WTW - WRITE WORDS FROM WORKING BUFFER. * * WTW TRANSFERS DATA FROM A WORKING BUFFER TO A * CIRCULAR BUFFER. * WTW IS ADAPTED FROM WTW= (COMCWTW). * * 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. * (IN) = IN POINTER TO USE. * * EXIT (IN) = UPDATED IN POINTER FOR FET. * * 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. WTW18 SX6 B3+B4 ADVANCE IN SB3 B3+B4 SB6 B6+B4 SB7 B7-B4 NE B3,B5,WTW19 IF IN " LIMIT SA1 A0+B1 IN = FIRST SX6 X1 WTW19 SA6 IN UPDATE IN NZ B7,WTW1 IF NOT END OF TRANSFER WTW SUBR ENTRY/EXIT WTW1 SA1 A0+3 (B4) = OUT SA3 IN (B3) = IN SA4 A1+B1 (B5) = LIMIT ZR B7,WTWX IF WORKING BUFFER EMPTY SB4 X1 SA1 A0+B1 (B2) = FIRST SB3 X3 SB5 X4 SB2 X1 SA1 B6 READ FIRST WORD NE B2,B4,WTW2 IF OUT " FIRST SB4 B5 WTW2 LT B3,B4,WTW3 IF NO END AROUND SB4 B5+1 WTW3 SB4 B4-B1 SB4 B4-B3 ZR B4,SMS1.0 IF NO ROOM BX7 X1 LE B4,B7,WTW4 IF NOT ENOUGH ROOM TO LIMIT SB4 B7 NO WRAPAOOUND * INITIALIZE REGISTERS FOR TRANSFER. WTWA BSS 0 WTW4 SA3 WTWC PRESET CMU CODE AND VOID STACK RJ WTW16 * SA1 A1+B1 (NO CMU) * SX4 B4-B1 (NO CMU) * MX6 -3 (NO CMU) * SA7 B3 (NO CMU) * * GT B4,B1,WTW14 IF MORE THAN 1 WORD (CMU) * BX4 X4-X4 (CMU) * SA7 B3 (CMU) WTW5 BX3 -X6*X4 NUMBER OF ODD WORDS AX4 3 NUMBER OF BLOCKS ZR X3,WTW7 IF NO ODD WORDS * TRANSFER UP TO 7 WORDS. WTW6 SX3 X3-1 BX7 X1 SA1 A1+B1 SA7 A7+B1 NZ X3,WTW6 LOOP * PRE-READ REGISTERS. WTW7 ZR X4,WTW18 IF NO BLOCKS SA2 A1+B1 SB2 B1+B1 (B2) = 2 SA3 A2+B1 SB3 X4 (B3) = BLOCK COUNT SA4 A3+B1 * TRANSFER 8 WORD BLOCKS. WTW8 BX6 X1 LX7 X2 SA1 A3+B2 SA2 A4+B2 SA6 A7+B1 SB3 B3-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 B3,WTW8 LOOP * WRITE EXIT. SA3 IN READ IN SA1 A0+4 (B5) = LIMIT SB5 X1 WTW9 SB6 B6+B4 SB7 B7-B4 SB3 X3+B4 ADVANCE IN SX6 X3+B4 SA3 A0+B1 READ FIRST NE B3,B5,WTW19 IF IN " LIMIT SX6 X3+ IN = FIRST WTW10 EQ WTW19 CLEAN UP AND RETURN * MOVE DATA WITH CMU. WTW14 SX4 B4-819 PL X4,WTW15 IF TOO BIG FOR CMU SX4 B4 10 * WORDS = CHARACTERS LX6 X4,B1 BX1 X0 SAVE X0 LX4 3 IX6 X4+X6 SX7 B6 SET SOURCE ADDRESS SX4 B3 SET DESTINATION ADDRESS LX7 30 BX4 X4+X7 MX7 -4 BX3 X7*X6 EXTRACT UPPER PORTION BX6 -X7*X6 EXTRACT LOWER PORTION LX3 48-4 BX4 X4+X3 LX6 26 BX6 X4+X6 AX3 51 SA6 WTWC STORE DESCRIPTOR WORD IM WTWC MOVE DATA BX0 X1 RESTORE X0 ZR X3,WTW18 IF NO WRITE EXIT SX3 B3 RESET IN JP WTW9 WTWB BSS 0 WTW15 SA1 A1+B1 MOVE DATA WITHOUT CMU SX4 B4-B1 MX6 -3 SA7 B3 JP WTW5 * CMU PRESET CODE. * WWTC IS READ UP AND THEN RETURN JUMPED TO IN ORDER TO VOID * STACK. WWTC IS ALSO USED AS THE CMU DESCRIPTOR WORD WTWC GT B4,B1,WTW14 IF MORE THAN 1 WORD TO MOVE (CMU) BX4 X4-X4 SA7 B3 WTW16 EQU WTWC USED TO VOID STACK * PRESET FOR CMU CODE. SA4 CMUR CHECK IF CMU AVAIALABLE SB4 WTWA NG X4,WTW17 IF CMU SA3 WTWB WTW17 BX6 X3 SA6 B4 JP WTW1 TITLE WORKING STORAGE. * WORKING STORAGE. PARL BSS 1 PARAMETER LIST POINTER IN BSS 1 IN POINTER FOR FET MBUF BSS 9 PACKED MESSAGE BUFFER SPACE 4 END