cdc:nos2.source:opl871:smsg
Table of Contents
SMSG
Table Of Contents
- [00002] SMSG - SEND MESSAGE TO M860.
- [00009] SEMD MESSAGE AND ASSOCIATED DATA TO M860.
- [00034] LOCAL MACROS.
- [00035] PACK - PACK AND STORE ONE MESSAGE WORD
- [00055] MAIN ROUTINE.
- [00161] SUBROUTINES.
- [00163] WTW - WRITE WORDS FROM WORKING BUFFER.
- [00348] WORKING STORAGE.
Source Code
- SMSG.txt
- 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
cdc/nos2.source/opl871/smsg.txt ยท Last modified: 2023/08/05 17:24 by Site Administrator