Trailing-Edge
-
PDP-10 Archives
-
cuspbinsrc_1of2_bb-x128c-sb
-
10,7/decmai/mx/senvax.mac
There are 24 other files named senvax.mac in the archive. Click here to see a list.
TITLE SENVAX KL TO VAX sender
TWOSEG
RELOC 400000
SEARCH MACSYM,MSUNV
EXTERN ER%PRC,MX$VAL,MXERRS,UF%CLO,UF%OPE,UF%REA,UF%WRI,UM%GET,UM%REL
EXTERN UMP%GE,UMP%RE,UN%ABO,UN%ACC,UN%CLO,UN%OPE,UN%REA,UN%STA,UN%WRI
EXTERN GETSUB,NW$ERR,S2$ERR,NMLDIE
;AC Definitions
T0==0 ;SCRATCH REGISTERS
T1==1
T2==2
T3==3
T4==4
T5==5
FLGWRD==5 ;CR AND LF FLAGS FOR SENDING MAIL FILE
T6==6
T7==7
T10==10
WRKREQ==11 ;WORK REQUEST POINTER
MSGBLK==12 ;MESSAGE BLOCK POINTER
;AC 13 AND 15 RESERVED FOR BLISS
T14==14 ;ANOTHER SCRATCH REGISTER
VARPTR==16 ;POINTS TO VARIABLES AND POINTERS BUFFER
P==17 ;STACK
;INFORMATION BLOCK OFFSETS
CNNBLK==0 ;CONNECT BLOCK ADDRESS
TOLIST==1 ;TO: LIST BUFFER POINTER
SNDSTR==2 ;SENDER STRING POINTER
WRKBUF==3 ;WORKING BUFFER ADDRESS
TOHOLD==4 ;RECIPIENTS FIT INTO TO: LIST BUFFER
FALSND==5 ;ALL RECIPIENTS O.K.ED BY VAX
MAIPTR==6 ;POINTS TO MAIL FILE SPEC
SCRAT1==7 ;SCRATCH WORDS
SCRAT2==10
SCRAT3==11
SCRAT4==12
NUMSUC==13 ;NUMBER OF SUCCESSFUL SENDS
SNDERR==14 ;SENDER STRING POINTER (7 BIT)
FILNB==15 ;FILE NUMBER OF MAIL FILE
DATLNK==16 ;SENVAX'S DATA LINK
BUFPTR==17 ;POINTER TO REPLIES FROM THE VAX
RCPT==20 ;NUMBER OF RECIPIENTS
FSRCPT==21 ;ADDRESS OF FIRST RECIPIENT BLOCK IN THIS PASS
FSTPSS==22 ;FIRST PASS FLAG
DSTNDE==23 ;DESTINATION NODE NAME
NUMVAR==25 ;INFORMATION BLOCK SIZE
;DEFINITIONS
$DONE==2 ;ALL RECIPIENTS RECEIVED MAIL
$DEFER==3 ;A NETWORK PROBLEM OCCURRED
$REJECT==5 ;ONE OR MORE RECIPIENTS DID NOT RECEIVE MAIL
CBKSIZ==^D64 ;CONNECTION BLOCK SIZE
VAXOBJ==^D27 ;VAX OBJECT TYPE
SUCBIT==2000 ;SUCCESS BIT FROM VAX REPLY
FAIBIT==1B31 ;FAILURE BIT FROM VAX REPLY
CRFLG==1B34 ;CARRIAGE RETURN WAS SEEN IN MAIL FILE LINE
LFFLG==1B35 ;LINE FEED WAS SEEN IN MAIL FILE LINE
DELVER==1B0 ;ADDRESSEE RECEIVED MAIL
REJECT==1B1 ;ADDRESSEE DID NOT RECEIVE MAIL
MAXSND==^D100 ;MAXIMUM NUMBER OF ADDRESSEES ALLOWED
.CR==15 ;CARRIAGE RETURN
.LF==12 ;LINE FEED
QUOTE==42 ;ASCII QUOTE VALUE
;SEVERITY CODES
$ERR==4
$INFO==3
;ERROR CODES
UF$FCF==8 ;MAIL FILE CLOSE ERROR
UF$FRF==9 ;MAIL FILE READ ERROR
UF$FOF==^D11 ;MAIL FILE OPEN ERROR
;FACILITY CODES
$PROTO==1 ;PROTOCOL ERROR
$MESSA==2 ;INFORMATIVE MESSAGE
;ERRORS REPORTED BY VMS MAIL-11
LOGLNK==125001,,760000 ;Error creating logical link
.DCX11==13
SALL
RELOC 0 ;DATA AREA (LOWSEG)
;THE ARGUMENT BLOCK PASSED TO ROUTINE ER%PRC (NETERR:)
ERRBLK: EXP 6 ;SIZE OF THE BLOCK
EXP FLD(1,1B3)!FLD($PROTO,37777B17)!FLD(1,1B18)!FLD(NW$ERR,37777B32)!FLD($ERR,7B35)
EXP 0,0 ;NO OPTIONAL DATA
EXP 2 ;NUMBER OF WORDS THAT FOLLOW
EXP 0 ;NODE NAME POINTER
EXP 0 ;NETWORK ERROR POINTER
;THE ARGUMENT BLOCK PASSED TO ROUTINE ER%PRC (FILERR:)
FILBLK: EXP 5 ;SIZE OF THE ARGUMENT BLOCK
EXP 0,0,0 ;FLAG, ID AND OPTIONAL DATA WORDS
EXP 1 ;NUMBER OF FOLLOWING WORDS
EXP 0 ;POINTER TO MAIL FILE SPEC
;THE ARGUMENT BLOCK PASSED TO ROUTINE ER%PRC (ADRERR:)
ADRBLK: EXP 5 ;SIZE OF THE ARGUMENT BLOCK
EXP FLD(1,1B3)!FLD($MESSA,37777B17)!FLD(1,1B18)!FLD(S2$ERR,37777B32)!FLD($ERR,7B35)
EXP 0,0 ;NO OPTIONAL DATA
EXP 1 ;NUMBER OF WORDS THAT FOLLOW
EXP 0 ;USER NAME POINTER
RELOC 400000 ;BACK TO THE HISEG
;SAVE REGISTERS ACCORDING TO BLISS CONVENTION
SENVAX::MOVE T5,P ;SAVE ORIGINAL STACK TO PICK UP ARGUMENTS LATER
PUSH P,T0 ;SAVE THE REGISTERS PRESERVED BY BLISS
PUSH P,T6
PUSH P,T7
PUSH P,T10
PUSH P,WRKREQ
PUSH P,MSGBLK
PUSH P,T14
PUSH P,VARPTR
MOVE WRKREQ,-2(T5) ;WORK REQUEST ADDRESS
MOVE MSGBLK,-1(T5) ;MESSAGE BLOCK ADDRESS
PUSH P,13 ;SAVE A BLISS LINKAGE REGISTER
;ALLOCATE BUFFER SPACES
CALL GETBUF
;MAKE THE CONNECTION
SETZM RCPT(VARPTR) ;NO RECIPIENTS YET
SETZM FALSND(VARPTR) ;NO REJECTED RECIPIENTS YET
SETZM FSTPSS(VARPTR) ;STILL ON FIRST PASS
MKECON: CALL CONECT
JRST RELBUF ;AN ERROR OCCURRED
;SEND THE SENDER'S NAME TO THE VAX
CALL SENSEN
JRST [ CALL ABTLNK ;A NETWORK ERROR OCCURRED, ABORT THE LINK
JRST RELBUF] ;RELEASE THE BUFFERS
;SEND THE ADDRESSEES TO THE VAX
CALL ADRSEN
JRST [ CALL ABTLNK ;A NETWORK ERROR OCCURRED, ABORT THE LINK
CALL ZREJEC ;ZERO OUT ANY REJECTED ADDRESSEESS
JRST RELBUF ] ;RELEASE THE BUFFERS
;SEND THE TO: LIST
CALL TOSEND
JRST [ CALL ABTLNK ;A NETWORK ERROR OCCURRED, ABORT THE LINK
CALL ZREJEC ;ZERO OUT ANY REJECTED ADDRESSEESS
JRST RELBUF] ;RELEASE THE BUFFERS
;SEND THE SUBJ: LINE
CALL SUBSEN
JRST [ CALL ABTLNK ;A NETWORK ERROR OCCURRED, ABORT THE LINK
CALL ZREJEC ;ZERO OUT ANY REJECTED ADDRESSEESS
JRST RELBUF] ;RELEASE THE BUFFERS
;OPEN THE MAIL FILE
CALL MAIOPN
JRST [ CALL ABTLNK ;A NETWORK ERROR OCCURRED, ABORT THE LINK
CALL ZREJEC ;ZERO OUT ANY REJECTED ADDRESSEESS
JRST RELBUF] ;RELEASE THE BUFFERS
;TRANSFER THE MAIL FILE AND THEN CLOSE IT
CALL MAISEN
JRST [ CALL ABTLNK ;A NETWORK ERROR OCCURRED, ABORT THE LINK
CALL ZREJEC ;ZERO OUT ANY REJECTED ADDRESSEESS
JRST RELBUF] ;RELEASE THE BUFFERS
;GET SUCCESS/FAILURE MESSAGES FOR EACH RECIPIENT FROM THE VAX
CALL SFMSG
JRST [ CALL ABTLNK ;A NETWORK ERROR OCCURRED, ABORT THE LINK
CALL ZREJEC ;ZERO OUT ANY REJECTED ADDRESSEESS
JRST RELBUF] ;RELEASE THE BUFFERS
;CLOSE THE LINK
SKIPE RCPT(VARPTR) ;ANY MORE RECIPIENTS?
JRST [ CALL CSLINK ;YES,
SETOM FSTPSS(VARPTR) ;NO LONGER THE FIRST PASS
JRST MKECON ] ;BEGIN A NEW SESSION
CALL CLOLIN ;NO, TERMINATE THIS SESSION
MOVEI T1,$DONE ;ASSUME ALL RECIPIENTS RECEIVED MAIL
SKIPE FALSND(VARPTR) ;DID THEY REALLY?
MOVEI T1,$REJECT ;NO, SO INDICATE SO
MOVEM T1,5(WRKREQ) ;STORE IN THE WORK REQUEST BLOCK
;RELEASE THE BUFFERS AND RETURN
RELBUF: CALL BUFREL ;RETURN THE BUFFERS
MOVE T1,5(WRKREQ) ;PICK UP STATUS FOR MX
POP P,13 ;RESTORE REGISITERS FOR BLISS
POP P,VARPTR
POP P,T14
POP P,MSGBLK
POP P,WRKREQ
POP P,10
POP P,T7
POP P,T6
POP P,T0
RET ;AND RETURN TO THE CALLING ROUTINE
SUBTTL GETBUF GET BUFFERS
;GET SPACE FOR LIST OF ADDRESSES AND POINTERS
GETBUF: PUSH P,[NUMVAR] ;GET SPACE FOR THE ADDRESS LIST
CALL UM%GET ;DO IT
ADJSP P,-1 ;RESET THE STACK
JUMPLE T1,BUFERR ;AN ERROR OCCURRED
MOVE VARPTR,T1 ;SAVE THE ADDRESS OF THE LIST
;GET SPACE FOR THE CONNECT BLOCK
PUSH P,[CBKSIZ] ;SIZE OF THE CONNECTION BLOCK
CALL UM%GET ;GET THE SPACE
ADJSP P,-1 ;ADJUST THE POINTER
JUMPLE T1,BUFERR ;ERROR, HALT
MOVEM T1,CNNBLK(VARPTR) ;SAVE THE ADDRESS FOR LATER
;ALLOCATE SPACE FOR THE TO: LIST
PUSH P,[^D70] ;BUFFER SIZE
CALL UM%GET ;GET THE SPACE
ADJSP P,-1 ;ADJUST THE POINTER
JUMPLE T1,BUFERR ;AN ERROR OCCURRED, HALT
HRLI T1,(POINT 8) ;MAKE INTO A POINTER
MOVEM T1,TOLIST(VARPTR) ;SAVE FOR LATER
;ALLOCATE SPACE FOR THE FROM STRING (8 BIT BYTE POINTER)
PUSH P,[^D70] ;AMOUNT OF SPACE NEEDED
CALL UM%GET ;GET THE SPACE
ADJSP P,-1 ;RESET THE STACK
JUMPLE T1,BUFERR ;AN ERROR OCCURRED
HRLI T1,(POINT 8) ;MAKE A POINTER
MOVEM T1,SNDSTR(VARPTR) ;SAVE FOR LATER
;ALLOCATE SPACE FOR THE FROM STRING (7 BIT BYTE POINTER)
PUSH P,[^D70] ;AMOUNT OF SPACE NEEDED
CALL UM%GET ;GET THE SPACE
ADJSP P,-1 ;RESET THE STACK
JUMPLE T1,BUFERR ;AN ERROR OCCURRED
HRLI T1,(POINT 7) ;MAKE A POINTER
MOVEM T1,SNDERR(VARPTR) ;SAVE FOR LATER
;ALLOCATE SPACE FOR A WORKING BUFFER
PUSH P,[^D100] ;THE NUMBER OF WORDS TO GET
CALL UM%GET ;GET THEM
ADJSP P,-1 ;RESET THE STACK
JUMPLE T1,BUFERR ;AN ERROR OCCURRED, HALT
MOVEM T1,WRKBUF(VARPTR) ;SAVE FOR LATER
HRLI T1,(POINT 8) ;MAKE INTO A POINTER
MOVEM T1,BUFPTR(VARPTR) ;FOR VAX REPLIES
RET ;RETURN
BUFERR: PUSH P,[POINT 7,[ASCIZ /No memory at BUFERR:(SENVAX)/]]
PUSHJ P,NMLDIE ;NO MEMORY AVAILABLE, HALT
SUBTTL CONECT MAKE THE CONNECTION
;CONSTRUCT THE CONNECT BLOCK
CONECT: MOVE T7,CNNBLK(VARPTR) ;GET ADDRESS OF THE DATA BLOCK
HRR T1,4(WRKREQ) ;DESTINATION NODE ADDRESS
HRLI T1,(POINT 8) ;MAKE INTO A POINTER
MOVEM T1,0(T7) ;NODE NAME POINTER
IBP T1 ;SKIP TWO NULLS
IBP T1
ILDB T2,T1 ;GET LENGTH
MOVEM T2,1(T7) ;NODE NAME LENGTH
MOVEI T2,DSTNDE(VARPTR) ;ADDRESS TO STORE ASCIZ NODE NAME
HRLI T2,(POINT 7) ;MAKE INTO A POINTER
NDECHR: ILDB T3,T1 ;GET NEXT 8 BIT BYTE NODE NAME CHR
IDPB T3,T2 ;PLACE IN 7 BIT BYTE BUFFER
CAIE T3,0 ;FINISHED?
JRST NDECHR ;NO, GET THE NEXT CHARACTER
MOVEI T1,VAXOBJ ;OBJECT TYPE
MOVEM T1,2(T7) ;PLACE IN THE CONNECT BLOCK
SETZM 3(T7) ;THE REST WILL BE ZEROED
HRLI T1,3(T7) ;PREPARE FOR THE BLT
HRRI T1,4(T7)
BLT T1,CBKSIZ-1(T7) ;ZERO THE REST OF THE BLOCK
;OPEN THE CONNECTION
PUSH P,[2] ;CONNECT TYPE 2, SOURCE
PUSH P,T7 ;LINK CONNECT BLOCK ADDRESS
PUSH P,[0] ;NO RESPONSE MESSAGE
PUSH P,[0] ;ZERO RESPONSE MESSAGE LENGTH
PUSH P,[0] ;NO ERROR CODE
CALL UN%OPEN ;OPEN AND BLOCK FOR INITIATION
ADJSP P,-5 ;RESET THE STACK
SKIPG T1 ;OBTAINED THE DATA LINK NUMBER?
JRST CONERR ;RETURN, A NETWORK ERROR OCCURRED
MOVEM T1,DATLNK(VARPTR) ;SAVE THE DATA LINK NUMBER FOR LATER
;WAIT FOR THE SLAVE'S CONFIRMATION/REJECTION
REPEAT 0,<
PUSH P,DATLNK(VARPTR) ;LINK IDENTIFIER
PUSH P,[^D4] ;NUMBER OF BYTES IN THE BUFFER
PUSH P,BUFPTR(VARPTR) ;POINTER TO THE BUFFER
CALL UN%REA ;CHECK FOR CONFIRMATION
ADJSP P,-3 ;ADJUST THE STACK
JUMPLE T1,CONERR ;RETURN, A NETWORK ERROR OCCURRED
HRRZ T2,BUFPTR(VARPTR) ;ADDRESS OF THE SUCCESS/FAIL MESSAGE
MOVE T2,0(T2) ;PICK UP THE STATUS WORD
TLNE T2,SUCBIT ;CONFIRMATION?
>
RETSKP ;YES RETURN TRUE
CONERR: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred while opening the link/]]
PUSH P,T1 ;PASS THE REASON FOR ERROR
CALL NETERR ;INFORM MX OF THE ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;ASSUME NO ONE RECEIVED MAIL
SKIPE FSTPSS(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEESS RECEIVED MAIL
MOVEM T1,5(WRKREQ) ;PLACE IN THE WORK REQUEST BLOCK
RET ;RETURN FALSE
SUBTTL SENSEN SEND THE SENDER STRING
;SENDER'S NAME IN MESSAGE BLOCK IS IN THE FORM NAME@NODE. TRANSLATE THIS
;TO NAME
SENSEN: SETZ T6, ;NUMBER OF CHARACTERS IN NAME SO FAR
HRR T4,1(MSGBLK) ;PICK UP ADDRESS OF SENDER STRING
HRLI T4,(POINT 7) ;MAKE INTO A POINTER
MOVE T2,SNDSTR(VARPTR) ;8 BIT BYTE POINTER TO STORE NAME IN
SETZ T3, ;NO QUOTES FOUND YET
FINDNM: ILDB T1,T4 ;GET THE FIRST NAME CHARACTER
CAIN T1," " ;A BLANK?
JRST FINDNM ;YES, IGNORE LEADING BLANKS
CAIN T1,QUOTE ;FIRST CHARACTER A QUOTE?
CALL SKPQTS ;Ignore the quoted string...
SKIPA
FINDN2: ILDB T1,T4 ;GET THE NEXT CHARACTER
CAIN T1,"@" ;END OF THE NAME FOUND?
JRST MKEASZ ;YES, MAKE ASCIZ AND SEND OFF TO VAX
CAIN T1,0 ;END OF THE NAME FOUND?
JRST SNDNAM ;YES, SEND OFF THE NAME TO THE VAX
CALL CHNUPC ;CHANGE ANY L.C. TO U.C.
IDPB T1,T2 ;STORE IN TEMPORARY BUFFER
AOS T6 ;INCREMENT THE CHARACTER COUNT
JRST FINDN2 ;GET THE NEXT CHARACTER
;SKPQTS: Ignore the quoted string...
;**;[303] ADD 1 LINE AT SKPQTS+2
SKPQTS: IDPB T1,T2 ;STORE THE CHARACTER IN THE TEMP BUFFER
ILDB T1,T4 ;GET THE NEXT CHARACTER
AOS T6 ;[303] INCREMENT THE CHARACTER COUNT
CAIE T1,QUOTE ;IS IT A QUOTE?
JRST SKPQTS ;NO, KEEP LOOKING
IDPB T1,T2 ;STORE THE CHARACTER IN THE TEMP BUFFER
RET ;ALL DONE, RETURN
;SEND OFF THE SENDER STRING TO THE VAX
MKEASZ: SETZ T1, ;ADD ASCIZ TERMINATION CHARACTER
SNDNAM: IDPB T1,T2 ;PLACE IN THE BUFFER
PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,T6 ;LENGTH OF STRING
MOVE T2,SNDSTR(VARPTR) ;POINTER TO STRING
PUSH P,T2 ;PASS AS AN ARGUMENT
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
JUMPLE T1,SENERR ;NETWORK ERROR
RETSKP ;RETURN SUCCESS
SENERR: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred while sending the sender's name/]]
PUSH P,T1 ;PASS THE REASON FOR THE ERROR
CALL NETERR ;INFORM MX OF THE ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;NETWORK ERROR
SKIPE FSTPSS(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEES RECEIVED MAIL
MOVEM T1,5(WRKREQ) ;STORE IN THE WORK REQUEST BLOCK
RET ;RETURN FALSE
SUBTTL ADRSEN SEND THE ADDRESSEES TO THE VAX
;THIS ROUTINE RETURNS WITH T2 CONTAINING THE NUMBER OF BYTES IN THE TO: LIST
;RETURNS WITH SCRAT2(VARPTR) POINTING TO END OF THE TO: LIST
;THESE ARE USED BY ROUTINE TOSEND
;THE MAXIMUM NUMBER OF BYTES ACCEPTED BY THE VAX IS 255, THEREFORE, IF THE
;TO: LIST CONTAINS MORE THAN 255, WE CANNOT SEND AS IS.
;INITIALIZE
ADRSEN: SKIPN T7,RCPT(VARPTR) ;FIRST PASS?
HLRZ T7,4(WRKREQ) ;NO, GET FIRST RECIPIENT FROM WORK REQ
MOVEM T7,FSRCPT(VARPTR) ;STORE AS FIRST RECIPIENT THIS PASS
SKIPA ;SKIP THE FIRST TIME
ADRSN1: MOVE T7,FSRCPT(VARPTR) ;GET THE FIRST RECIPIENT
SETZM NUMSUC(VARPTR) ;NO SUCCESSFUL SENDS YET
SETZM TOHOLD(VARPTR) ;ROOM SO FAR IN THE TO: LIST BUFFER
MOVE T3,TOLIST(VARPTR) ;8 BIT BYTE POINTER TO TO: LIST BUFFER
SETZ T2, ;NO CHARACTERS YET IN TO: LIST BUFFER
MOVEM T3,SCRAT3(VARPTR) ;SAVE FOR LATER
MOVEM T2,SCRAT4(VARPTR) ;SAVE FOR LATER
MOVE T5,WRKBUF(VARPTR) ;ADDRESS OF THE WORKING BUFFER
HRLI T5,(POINT 8) ;MAKE IT INTO A POINTER
MOVEM T5,SCRAT1(VARPTR) ;SAVE FOR LATER
;EACH ADDRESSEE STRING IS OF THE FORM @NODE1,@NODE2,...,@NODE3:USERNAME@NODE4.
;THE VAX EXPECTS THE FORM NODE1::NODE2::...NODE4::USERNAME.
;INITIALIZE, DETERMINE IF THE CURRENT ADDRESSEE NAME IS PRECEDED BY A NODE NAME
NXTADR: MOVE T6,1(T7) ;GET ADDRESSEE'S FLAG WORD
TXNE T6,REJECT ;WAS MAIL PREVIOUSLY REJECTED?
JRST GETNXT ;YES, GET THE NEXT ADDRESSEE
HLR T6,0(T7) ;ADDRESS OF ADDRESSEE STRING
HRLI T6,(POINT 7) ;MAKE IT INTO A POINTER
MOVEM T6,SCRAT2(VARPTR) ;MAY NEED TO RESET POINTER
MOVE T5,SCRAT1(VARPTR) ;8 BIT BYTE POINTER TO WORKING BUFFER
MOVE T0,SNDERR(VARPTR) ;7 BIT BYTE POINTER TO USER NAME
SETZ T10, ;NO CHARACTERS IN WORKING BUFFER YET
MOVE T3,SCRAT3(VARPTR) ;POINT TO CURRENT POSITION IN TO: LIST
MOVE T2,SCRAT4(VARPTR) ;CURRENT NUMBER OF BYTES IN TO: LIST
ILDB T1,T6 ;GET THE FIRST ADDRESSEE CHARACTER
CAIE T1,"@" ;NODE NAME?
JRST [ MOVE T6,SCRAT2(VARPTR) ;NO, RESET TO START OF ADDRESSEE
JRST FINALN ] ;GET THE FINAL NODE NAME
;TRANSFER THIS NODE NAME TO THE WORKING BUFFER TO BE SENT TO THE VAX, AND IF
;ROOM, PLACE IN THE TO: LIST BUFFER
NXNDCH: ILDB T1,T6 ;GET THE NEXT NODE NAME CHARACTER
CAIN T1,"," ;END OF THE NODE NAME?
JRST FINNDE ;YES, APPEND TWO COLONS
CAIN T1,":" ;LAST NODE NAME?
JRST LSTNDE ;YES, GET THE USER NAME
CALL CHNUPC ;CHANGE ANY LOWER CASE TO UPPER CASE
IDPB T1,T5 ;PLACE IN THE WORKING BUFFER
AOS T10 ;INCREMENT WORKING BUFFER BYTE COUNT
CAIL T2,^D256 ;ROOM IN TO: LIST BUFFER
JRST NXNDCH ;NO, SO GET NEXT NODE NAME CHARACTER
IDPB T1,T3 ;PLACE CHARACTER IN THE TO: LIST BUFFER
AOS T2 ;INCREMENT THE TO: LIST BYTE COUNT
JRST NXNDCH ;GET THE NEXT NODE NAME CHARACTER
;A COMMA HAS BEEN FOUND IN THE ADDRESSEE STRING. APPEND TWO COLONS TO THE NODE
;NAME IN THE WORKING BUFFER AND THE TO: LIST BUFFER, IF ROOM, THEN GET THE NEXT
;NODE NAME
FINNDE: CALL ADDCOL ;ADD TWO COLONS
IBP T6 ;GET RID OF THE @
JRST NXNDCH ;LOOK FOR THE NEXT NODE
;THE LAST NODE BEFORE THE USER NAME HAS BEEN FOUND. APPEND TWO COLONS IN
;WORKING BUFFER AND THE TO: LIST BUFFER IF SPACE.
LSTNDE: CALL ADDCOL ;ADD TWO COLONS
;ADD THE NODE NAME FOLLOWING THE USER NAME
MOVEM T6,SCRAT2(VARPTR) ;SAVE POINTER TO USER NAME
FINALN: MOVEI T4,"@" ;ASSUME NAME NOT SURROUNDED BY QUOTES
ILDB T1,T6 ;GET FIRST USER NAME CHARACTER
CAIN T1,QUOTE ;IS IT A QUOTE?
MOVEI T4,QUOTE ;YES, SET END OF NAME CHARACTER
FINAL2: ILDB T1,T6 ;GET THE NEXT CHARACTER
CAME T1,T4 ;END OF THE USER NAME?
JRST FINAL2 ;NO, GET THE NEXT CHARACTER
CAIN T4,QUOTE ;IS QUOTE END OF USER NAME?
IBP T6 ;YES, STRIP OFF THE FOLLOWING @
FINAL3: ILDB T1,T6 ;GET THE NEXT NODE NAME CHARACTER
CAIN T1,0 ;THE END OF THE NODE NAME?
JRST RESPTR ;YES, COPY OVER THE USER NAME
CALL CHNUPC ;CHANGE ANY LOWER CASE TO UPPER CASE
JUMPE T10,FINAL4 ;IF ONLY 1 NODE NAME, DO NOT INCLUDE
IDPB T1,T5 ;PLACE CHARACTER IN WORKING BUFFER
AOS T10 ;INCREMENT WORKING BUFFER BYTE COUNT
FINAL4: CAIL T2,^D256 ;ROOM IN TO: LIST BUFFER
JRST FINAL3 ;NO, SO GET NEXT NODE NAME CHARACTER
IDPB T1,T3 ;PLACE CHARACTER IN THE TO: LIST BUFFER
AOS T2 ;INCREMENT THE TO: LIST BYTE COUNT
JRST FINAL3 ;GET THE NEXT NODE NAME CHARACTER
RESPTR: JUMPG T10,RESPT2 ;DO NOT ADD COLONS TO WORK BUFFER
MOVEI T1,":" ;PICK UP A COLON
CALL ADDCO2 ;ADD TO TO: BUFFER
SKIPA ;DON'T DO IT AGAIN
RESPT2: CALL ADDCOL ;ADD TWO COLONS
MOVE T6,SCRAT2(VARPTR) ;POINT TO USER NAME
ILDB T1,T6 ;GET THE FIRST USER NAME CHARACTER
CAIE T4,QUOTE ;Is name surrounded by quotes
JRST GETUS2 ;PLACE IN THE BUFFER
MOVE T1,8(WRKREQ) ;Get the strip quotes flag
CAIE T1,2 ;Strip them?
JRST [MOVEI T1,QUOTE ;No, reset T1
JRST GETUS2] ;Place in the buffer
ILDB T1,T6 ;Skip the quote
JRST GETUS2 ;Place next character in the buffer
;MOVE THE USERS NAME OVER TO THE WORKING BUFFER
GETUSR: ILDB T1,T6 ;GET THE NEXT CHARACTER
CAMN T1,T4 ;END OF THE USER NAME?
JRST LASTN1 ;YES, MAKE THE STRING ASCIZ
GETUS2: CAIE T4,QUOTE ;NAME SURROUNDED BY QUOTES?
CALL CHNUPC ;NO, CONVERT ANY L.C. TO U.C.
IDPB T1,T5 ;PLACE CHARACTER IN WORKING BUFFER
IDPB T1,T0 ;PLACE IN 7 BIT BYTE ERROR MESSAGE
AOS T10 ;INCREMENT THE BYTE COUNT
CAIL T2,^D255 ;ROOM IN THE TO: LIST?
JRST GETUSR ;NO, GET THE NEXT CHARACTER
IDPB T1,T3 ;YES, PLACE IN THE TO: LIST
AOS T2 ;INCREMENT THE TO: LIST BYTE COUNT
JRST GETUSR ;GET THE NEXT CHARACTER
;MAKE THE ADDRESSEE STRING ASCIZ
LASTN1: CAIE T1,QUOTE ;IS TERMINATION CHARACTER A QUOTE?
JRST MAKASZ ;NO, MAKE STRING ASCIZ NOW
MOVE T1,8(WRKREQ) ;Get the strip quotes flag
CAIN T1,2 ;Strip it?
JRST MAKASZ ;Yes
MOVEI T1,QUOTE ;Reset T1
IDPB T1,T5 ;PLACE THE QUOTE IN THE WORKING BUFFER
IDPB T1,T0 ;PLACE IN THE 7 BIT BYTE ERROR MESSAGE
AOS T10 ;INCREMENT THE BYTE COUNT
CAIL T2,^D255 ;ROOM IN THE TO: LIST?
JRST MAKASZ ;NO, SO MAKE WORKING STRING ASCIZ
IDPB T1,T3 ;PLACE IN THE TO: LIST
AOS T2 ;INCREMENT ITS BYTE COUNT
MAKASZ: MOVEI T1,0 ;ASCIZ STRING TERMINATOR
IDPB T1,T5 ;PLACE IN THE TEMPORARY BUFFER
IDPB T1,T0 ;PLACE IN 7 BIT BYTE ERROR MESSAGE
;SEND THE CURRENT ADDRESSEE NAME OFF TO THE VAX
SNDVAX: PUSH P,T2 ;NEED LATER AND DESTROYED BY UN%WRI
PUSH P,T3 ;NEED LATER AND DESTROYED BY UN%WRI
PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,T10 ;LENGTH OF STRING
MOVE T5,SCRAT1(VARPTR) ;POINT TO THE TO: LIST
PUSH P,T5 ;PASS AS AN ARGUMENT
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
JUMPLE T1,ADRESE ;NETWORK ERROR
;WAIT FOR THE SLAVE'S CONFIRMATION/REJECTION
PUSH P,T2 ;DESTROYED BY UN%REA
PUSH P,T3 ;DESTROYED BY UN%REA
PUSH P,DATLNK(VARPTR) ;DATA LINK NUMBER
PUSH P,[^D16] ;NUMBER OF BYTES IN THE BUFFER
PUSH P,BUFPTR(VARPTR) ;POINTER TO THE BUFFER
CALL UN%REA ;CHECK FOR CONFIRMATION
ADJSP P,-3 ;ADJUST THE STACK
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
JUMPLE T1,ADRESE ;RETURN, A NETWORK ERROR OCCURRED
HRRZ T1,BUFPTR(VARPTR) ;ADDRESS OF THE SUCCESS/FAIL MESSAGE
MOVE T1,0(T1) ;PICK UP THE STATUS WORD
TLNE T1,SUCBIT ;CONFIRMATION?
JRST [ AOS NUMSUC(VARPTR) ;INCREMENT NUMBER OF SUCCESSFUL SENDS
JRST NXTONE ] ;SET UP FOR THE NEXT ADDRESSEE
TRZ T1,17 ;Clear bits 32-35
CAMN T1,[LOGLNK] ;Is this an "Error creating log. link"?
JRST ADRESE ;Yes. Treat it as a network error
SETOM FALSND(VARPTR) ;No, VAX REJECTED THIS ADDRESSEE
MOVE T6,1(T7) ;GET THE ADDRESSEE FLAG WORD
TXO T6,REJECT ;ADDRESSEE REJECTED
MOVEM T6,1(T7) ;STORE UPDATED FLAG WORD
;GET THE ERROR TEXT MESSAGE
HRRZ T1,BUFPTR(VARPTR) ;ADDRESS OF THE ERROR MESSAGE
MOVE T2,T1 ;SAVE A COPY FOR THE BLT
SETZM 0(T1) ;ZERO THE FIRST WORD FOR THE BLT
HRLS T1 ;STARTING ADDRESS IN LEFT
AOS T1 ;DESTINATION ADDRESS IN RIGHT
BLT T1,^D99(T2) ;ZERO THE BUFFER
PUSH P,DATLNK(VARPTR) ;DATA LINK NUMBER
PUSH P,[^D400] ;NUMBER OF BYTES IN THE BUFFER
PUSH P,BUFPTR(VARPTR) ;POINTER TO THE BUFFER
CALL UN%REA ;CHECK FOR CONFIRMATION
ADJSP P,-3 ;ADJUST THE STACK
JUMPLE T1,ADRESE ;RETURN, A NETWORK ERROR OCCURRED
MOVE T1,BUFPTR(VARPTR) ;GET 8 BIT BYTE POINTER FOR ERROR
HRRZ T2,SNDERR(VARPTR) ;ADDRESS OF 7 BIT BYTE ERROR MESSAGE
MOVE T3,T2 ;SAVE FOR THE BLT
SETZM 0(T2) ;ZERO OUT THE FIRST WORD
HRLS T2 ;PUT ADDRESS IN BOTH HALVES
AOS T2 ;SET UP FOR THE BLT
BLT T2,^D69(T3) ;ZERO OUT THE ENTIRE ERROR BUFFER
MOVE T2,SNDERR(VARPTR) ;POINTER TO 7 BIT BYTE ERROR MESSAGE
MOVE T4,T2 ;SAVE FOR INFORMING MX OF THE ERROR
GETREA: ILDB T3,T1 ;GET THE NEXT 8 BIT BYTE
IDPB T3,T2 ;PLACE IN THE ASCIZ STRING
CAIE T3,0 ;FINISHED?
JRST GETREA ;NO, GET THE NEXT BYTE
PUSH P,T4 ;YES, PASS AS AN ARGUMENT
CALL ADRERR ;INFORM MX OF THE REJECTED ADDRESSEE
ADJSP P,-1 ;RESET THE STACK
CALL ABTLNK ;ABORT THE LINK
CALL CONECT ;OPEN THE NEW LINK
JRST [ ADJSP P,-1 ;NETWORK ERROR, FAKE A RET
JRST RELBUF ] ;RELEASE THE BUFFER SPACE
CALL SENSEN ;SEND THE STRINGER STRING TO THE VAX
RET ;A NETWORK ERROR OCCURRED
JRST ADRSN1 ;TRY AGAIN, IGNORE REJECTED RECIPIENTS
;SET UP FOR THE NEXT ADDRESSEE
NXTONE: CAIL T2,^D255 ;ROOM IN THE TO: LIST?
JRST GETNXT ;NO, GET THE NEXT ADDRESSEE
MOVEM T3,SCRAT2(VARPTR) ;SAVE CURRENT END OF TO: LIST
MOVEI T1,"," ;PICK UP A COMMA
IDPB T1,T3 ;PLACE IN THE TO: LIST BUFFER
MOVEI T1," " ;PICK UP A BLANK
IDPB T1,T3 ;PLACE IN THE TO: LIST BUFFER
AOS T2 ;INCREMENT THE TO: LIST BYTE COUNT
AOS T2 ;AGAIN
MOVEM T3,SCRAT3(VARPTR) ;SAVE CURRENT POSITION IN THE TO: LIST
MOVEM T2,SCRAT4(VARPTR) ;SAVE CURRENT BYTE COUNT IN TO: LIST
GETNXT: HRRZ T7,0(T7) ;GET THE NEXT ADDRESSEE ADDRESS
CAIE T7,0 ;THE LAST ONE?
JRST [ MOVE T1,NUMSUC(VARPTR) ;GET NUMBER OF SUCCESSFUL RECIPIENTS
CAIGE T1,MAXSND ;GREATER THAN THE VAX CAN HANDLE?
JRST NXTADR ;NO, VALIDATE THE NEXT ADDRESSEE
MOVEM T7,RCPT(VARPTR) ;YES, 1ST ADDRESSEE OF THE NEXT PASS
JRST SNDEND ] ;SEND EOA MESSAGE FOR THIS PASS
SKIPG NUMSUC(VARPTR) ;ANY SUCCESSFUL RECIPIENTS?
JRST [ MOVEI T1,$REJECT ;NO, SET THE RETURN CODE
JRST RETSND ] ;AND RETURN FALSE
SETZM RCPT(VARPTR) ;FIRST PASS?
CAILE T2,^D255 ;TO: LIST BUFFER EXHAUSTED?
SNDEND: SETOM TOHOLD(VARPTR) ;YES, SO MUST USE "DISTRIBUTION"
SUBI T2,2 ;CORRECT THE BYTE COUNT
;SEND THE END OF ADDRESSEES MESSAGE
HRRZ T1,BUFPTR(VARPTR) ;ADDRESS OF THE MESSAGE
SETZM 0(T1) ;ALL ZEROES
HRLI T1,(POINT 8) ;MAKE IT A POINTER
PUSH P,T2 ;NEED CONTENTS FOR ROUTINE TOSEND
PUSH P,DATLNK(VARPTR) ;DATA LINK NUMBER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,[1] ;LENGTH OF THE MESSAGE
PUSH P,T1 ;POINTER TO THE MESSAGE
CALL UN%WRI ;SEND THE MESSAGE
ADJSP P,-4 ;ADJUST THE STACK
POP P,T2 ;RESTORE THE TO: LIST BYTE COUNT
JUMPLE T1,ADRESE ;NETWORK ERROR OCCURRED
RETSKP ;RETURN TRUE, NO NETWORK ERRORS
;ROUTINE TO ADD TWO COLONS
ADDCOL: MOVEI T1,":" ;PICK UP A COLON
IDPB T1,T5 ;PLACE IN THE WORKING BUFFER
IDPB T1,T5 ;THE VAX WANTS TWO
AOS T10 ;INCREMENT THE BYTE COUNT
AOS T10 ;AGAIN
ADDCO2: CAIL T2,^D255 ;ROOM IN THE TO: LIST?
RET ;NO, SO GET THE NEXT NODE
IDPB T1,T3 ;YES, PLACE IN THE TO: LIST BUFFER
IDPB T1,T3 ;AGAIN
AOS T2 ;INCREMENT THE TO: LIST BYTE COUNT
AOS T2 ;AGAIN
RET ;GET THE NEXT NODE
;A NETWORK ERROR OCCURRED
ADRESE: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred during recipient validation/]]
PUSH P,T1 ;PASS THE REASON FOR THE ERROR
CALL NETERR ;INFORM MX OF THE NETWORK ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;NETWORK ERROR
SKIPE FSTPSS(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEES RECEIVED MAIL
RETSND: MOVEM T1,5(WRKREQ) ;PLACE IN THE WORK REQUEST BLOCK
RET ;RETURN FALSE
;ROUTINE TO CONVERT LOWER CASE CHARACTERS TO UPPER CASE CHARACTERS
CHNUPC: CAIL T1,"a"
CAILE T1,"z"
SKIPA
SUBI T1,40
RET
SUBTTL TOSEND SEND THE TO: LIST
;DETERMINE IF THE TO: LIST BUFFER CONTAINS ALL THE ADDRESSEES
;T2 AND SCRAT2(VARPTR) VALUES COME FROM ROUTINE ADRSEN
TOSEND: SKIPE TOHOLD(VARPTR) ;TO: LIST GOOD AS IS?
JRST SENTO ;NO, MAKE ONE UP
MOVE T1,SCRAT2(VARPTR) ;POINTER TO END OF TO: LIST
MOVEI T3,0 ;GET A 0
IDPB T3,T1 ;MAKE IT AN ASCIZ STRING
JRST SNDTOL ;SEND IT OFF TO THE VAX
;MAKE UP A TO: LIST
SENTO: HRLI T1,DISTRI ;ADDRESS OF STRING TO COPY
HRR T1,TOLIST(VARPTR) ;WHERE TO COPY TO
HRRZ T3,T1 ;STARTING ADDRESS OF WHERE TO COPY
BLT T1,3(T3) ;COPY THE TO: STRING
MOVEI T2,^D13 ;THE NUMBER OF BYTES IN THE STRING
;SEND TO THE VAX
SNDTOL: MOVE T1,TOLIST(VARPTR) ;8 BIT BYTE POINTER TO TO: LIST
PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,T2 ;LENGTH OF STRING
PUSH P,T1 ;POINTER TO STRING
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
JUMPLE T1,TOERR ;NETWORK ERROR
RETSKP ;RETURN TRUE
TOERR: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred while sending the To: list/]]
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL NETERR ;INFORM MX OF THE ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;NETWORK ERROR
SKIPE FSTPSS(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEES RECEIVED MAIL
MOVEM T1,5(WRKREQ) ;PLACE IN THE WORK REQUEST BLOCK
RET ;RETURN FALSE
DISTRI: BYTE(8)"D","i","s","t","r","i","b","u","t","i","o","n"
EXP 0
REPEAT 0,<
SUBTTL SUBSEN SEND THE SUBJ: LINE
;SEND A READY MADE SUBJECT LINE
SUBSEN: MOVEI T1,SUBLIN ;POINT TO THE SUBJECT LINE
HRLI T1,(POINT 8) ;MAKE IT INTO A POINTER
MOVEI T2,^D22 ;THE LENGTH OF THE SUBJECT LINE
PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,T2 ;LENGTH OF STRING
PUSH P,T1 ;POINTER TO STRING
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
JUMPLE T1,SUBERR ;NETWORK ERROR
RETSKP ;RETURN TRUE
SUBERR: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred while sending the SUBJECT: line/]]
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL NETERR ;INFORM MX OF THE ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;NETWORK ERROR
SKIPE FSTPSS(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEES RECEIVED MAIL
MOVEM T1,5(WRKREQ) ;STORE IN THE WORK REQUEST
RET ;RETURN FALSE
SUBLIN: BYTE(8)"M","a","i","l"," ","f","r","o","m"," ","a"," ","T","O","P","S"
BYTE(8)" ","N","o","d","e"
>
SUBTTL SUBSEN SEND THE SUBJ: LINE
;SEND THE SUBJECT LINE
SUBSEN: HLRZ T1,4(MSGBLK) ;GET ADDRESS OF THE SUBJECT LINE
JUMPN T1,SNDSUB ;GO SEND IT, IF IT EXISTS
HLR T1,0(MSGBLK) ;GET ADDRESS OF THE FILE SPEC
HRLI T1,(POINT 7) ;MAKE IT INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL GETSUB ;GET THE SUBJECT LINE
ADJSP P,-1 ;RESET THE STACK
JUMPE T1,BLKSUB ;THERE IS NONE, SEND A BLANK
HRLM T1,4(MSGBLK) ;SAVE, MAY NEED ANOTHER TIME
SNDSUB: HRLI T1,(POINT 7) ;MAKE INTO A POINTER
MOVE T4,WRKBUF(VARPTR) ;ADDRESS OF BUFFER TO PLACE 8 BIT BYTES
HRLI T4,(POINT 8) ;MAKE INTO A POINTER
SETZ T2, ;NUMBER OF BYTES IN THE SUBJECT
NXTSUB: ILDB T3,T1 ;GET THE NEXT CHARACTER
IDPB T3,T4 ;PLACE IN 8 BIT BYTE BUFFER
JUMPE T3,NXTSU2 ;DON'T INCLUDE THE NULL IN BYTE COUNT
AOS T2 ;INCREMENT THE BYTE COUNT
JRST NXTSUB ;NO, GET THE NEX CHARACTER
NXTSU2: MOVE T1,WRKBUF(VARPTR) ;ADDRESS OF THE 8 BIT BYTE BUFFER
HRLI T1,(POINT 8) ;MAKE INTO A POINTER
CALL SNDSJT ;SEND OFF TO THE VAX
JUMPLE T1,SUBERR ;NETWORK ERROR OCCURED IF NEGATIVE
JRST COMSUB ;SUCCESS, RETURN
BLKSUB: MOVEI T1,WRKBUF(VARPTR) ;NO SUBJECT LINE GIVEN, SEND A BLANK
HRLI T1,(POINT 8) ;MAKE IT INTO A POINTER
MOVE T2,T1 ;SAVE FOR THE CALL TO SNDSJT
MOVEI T3," " ;PICK UP A BLANK
IDPB T3,T2 ;PLACE IN THE BUFFER
SETZ T3, ;GET THE ASCIZ TERMINATION CHARACTER
IDPB T3,T2 ;MAKE IT ASCIZ FOR UN%WRI
MOVEI T2,1 ;LENGTH OF MESSAGE
CALL SNDSJT ;SEND OFF TO THE VAX
SKIPLE T1 ;NETWORK ERROR?
COMSUB: RETSKP ;NO, RETURN SUCCESSFULLY
SUBERR: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred while sending the SUBJECT: line/]]
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL NETERR ;INFORM MX OF THE ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;NETWORK ERROR
SKIPE FSTPSS(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEES RECEIVED MAIL
MOVEM T1,5(WRKREQ) ;STORE IN THE WORK REQUEST
RET ;RETURN FALSE
SNDSJT: PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,T2 ;LENGTH OF STRING
PUSH P,T1 ;POINTER TO STRING
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
RET ;RETURN TRUE
SUBTTL MAIOPN OPEN THE MAIL FILE
MAIOPN: HLR T1,0(MSGBLK) ;MAIL FILE SPEC FROM MESSAGE BLOCK
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
MOVEM T1,MAIPTR(VARPTR) ;SAVE FOR MAIL FILE TRANSFER IN MAISEN
PUSH P,T1 ;PASS AS AN ARUGMENT
PUSH P,[1] ;READ ACCESS
PUSH P,[0] ;NO ERROR BUFFER
CALL UF%OPE ;OPEN THE MAIL FILE
ADJSP P,-3 ;RESTORE THE STACK
JUMPLE T1,OPNERR ;AN ERROR OCCURRED
MOVEM T1,FILNB(VARPTR) ;SAVE THE FILE NUMBER FOR LATER
RETSKP ;RETURN TRUE
OPNERR: MOVE T1,FGWRD1 ;GET THE FLAG WORD
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL FILERR ;INFORM MX OF THE MAIL FILE ERROR
ADJSP P,-1 ;RESET THE STACK
MOVEI T1,$REJECT ;NO USERS GOT THIS MAIL
MOVEM T1,5(WRKREQ) ;PLACE IN THE WORK REQUEST BLOCK
RET ;RETURN FALSE
FGWRD1: EXP FLD(1,1B3)!FLD($MESSA,37777B17)!FLD(1,1B18)!FLD(UF$FOF,37777B32)!FLD($ERR,7B35)
SUBTTL MAISEN TRANSFER THE MAIL FILE
;PLACE A DELIMITER LINE BETWEEN THE HEADER AND MAIL FILE
MAISEN: SETOM T7 ;LOOP COUNTER
MOVEI T1,TOPLIN ;DELIMITER LINE
SKIPA
MAISE2: MOVEI T1,SNDLIN ;SEND A BLANK LINE OVER
HRLI T1,(POINT 8) ;MAKE IT INTO A POINTER
MOVEI T2,^D11 ;THE LENGTH OF THE SUBJECT LINE
PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,T2 ;LENGTH OF STRING
PUSH P,T1 ;POINTER TO STRING
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
JUMPLE T1,OUTERR ;NETWORK ERROR
AOJE T7,MAISE2 ;SEND A BLANK LINE OVER
SETZ T7, ;NO BYTES IN THE OUTPUT BUFFER
MOVE T6,SNDSTR(VARPTR) ;8 BIT BYTE POINTER TO OUTPUT BUFFER
;READ IN THE NEXT BUFFER FROM THE MAIL FILE
NXTBUF: PUSH P,FILNB(VARPTR) ;FILE NUMBER OF THE MAIL FILE
MOVE T14,WRKBUF(VARPTR) ;POINT TO THE START OF THE BUFFER
HRLI T14,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T14 ;PASS AS AN ARGUMENT
PUSH P,[^D255] ;MAXIMUM NUMBER OF BYTES IN BUFFER
PUSH P,[0] ;NO ERROR BUFFER
CALL UF%REA ;READ THE NEXT MAIL FILE BUFFER
ADJSP P,-4 ;RESET THE STACK
SETZ FLGWRD, ;NO CR OR LF SEEN
JUMPL T1,REAERR ;AN ERROR OCCURRED
JUMPE T1,EOFFND ;END OF FILE
MOVE T10,T1 ;THE NUMBER OF BYTES IN THE BUFFER
;READ THE NEXT CHARACTER. WHEN BOTH A CR AND LF HAS BEEN FOUND SEND THE
;OUTPUT BUFFER
NXTCHR: ILDB T1,T14 ;GET NEXT CHARACTER FROM INPUT BUFFER
CAIE T1,.CR ;IS IT A CARRIAGE RETURN?
JRST CHKLF ;NO, CHECK IF IT IS A LINE FEED
TXO FLGWRD,CRFLG ;LITE THE CARRIAGE RETURN FLAG
TXNN FLGWRD,LFFLG ;HAS A LF ALSO BEEN SEEN?
JRST DECCNT ;NO,CHECK FOR END OF INPUT BUFFER
CALL SENDIT ;SEND THE OUTPUT BUFFER
RET ;NETWORK ERROR OCCURRED
JRST DECCNT ;CHECK FOR END OF INPUT BUFFER
CHKLF: CAIE T1,.LF ;IS IT A LINE FEED?
JRST DEPBYT ;NO, DEPOSIT IN THE OUTPUT BUFFER
TXO FLGWRD,LFFLG ;LITE THE LINE FEED FLAGE
TXNN FLGWRD,CRFLG ;HAS A CR RETURN ALSO BEEN SEEN?
JRST DECCNT ;NO, CHECK FOR END OF INPUT BUFFER
CALL SENDIT ;SEND THE OUTPUT BUFFER
RET ;NETWORK ERROR OCCURRED
JRST DECCNT ;CHECK FOR END OF INPUT BUFFER
;CHARACTER IS NOT A CR OR LF, DEPOSIT IN THE OUTPUT BUFFER. IF NO ROOM, SEND
;TO THE VAX AND REINIALIZE THE OUTPUT BUFFER
DEPBYT: IDPB T1,T6 ;DEPOSIT CHARACTER IN OUTPUT BUFFER
AOS T7 ;NUMBER OF BYTES IN OUTPUT BUFFER
CAIGE T7,^D255 ;ANY ROOM LEFT IN THE BUFFER?
JRST DECCNT ;YES, JUST CHECK FOR END INPUT BUFFER
CALL SENBUF ;SEND OUTPUT BUFFER, REINITIALIZE IT
RET ;NETWORK ERROR OCCURRED
;DECREMENT INPUT BUFFER BYTE COUNT AND EITHER GET THE NEXT CHARACTER OR IF
;EMPTY, GET THE NEXT BUFFER
DECCNT: SOSE T10 ;DECREMENT INPUT BUFFER BYTE COUNT
JRST NXTCHR ;NOT EMPTY, GET THE NEXT BYTE
JRST NXTBUF ;EMPTY, READ IN THE NEXT BUFFER
;A CR AND LF HAVE BOTH BEEN FOUND. SEND THE OUTPUT BUFFER TO THE VAX
;IF THE SEQUENCE CR,LF,CR,LF ...CR,LF HAS BEEN FOUND, REPLACE EACH NULL
;LINE WITH A SINGLE BLANK CHARACTER. FINALLY REINITIALIZE THE OUTPUT BUFFER
SENDIT: SETZ FLGWRD, ;RESET THE CR AND LF FLAG WORD
SKIPE T7 ;IS THE OUTPUT BUFFER EMPTY?
JRST SENBUF ;NO, SEND IT AS IS
MOVEI T1," " ;GET A BLANK
IDPB T1,T6 ;AND PLACE IN THE OUTPUT BUFFER
MOVEI T7,1 ;BYTE COUNT OF OUTPUT BUFFER
SENBUF: PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,T7 ;LENGTH OF STRING
MOVE T6,SNDSTR(VARPTR) ;POINTER TO OUTPUT BUFFER
PUSH P,T6 ;PASS AS AN ARGUMENT
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
JUMPLE T1,OUTERR ;NETWORK ERROR OCCURRED
SETZ T7, ;RESET OUTPUT BUFFER BYTE COUNT
RETSKP ;RETURN TRUE
;THE MAIL FILE HAS BEEN TRANSFERED, SEND AN END OF MESSAGE TO THE VAX
EOFFND: HRRZ T1,SNDSTR(VARPTR) ;ADDRESS OF THE MESSAGE
SETZM 0(T1) ;THE MESSAGE IS A ZERO BYTE
MOVE T1,SNDSTR(VARPTR) ;POINTER TO THE MESSAGE
PUSH P,DATLNK(VARPTR) ;DATA LINK IDENTIFIER
PUSH P,[1] ;END OF MESSAGE FLAG
PUSH P,[1] ;LENGTH OF STRING
PUSH P,T1 ;POINTER TO THE MESSAGE
CALL UN%WRI ;SEND THE STRING OFF TO THE VAX
ADJSP P,-4 ;ADJUST THE STACK
JUMPLE T1,OUTERR ;AN ERROR OCCURRED
CALL MAICLO ;CLOSE THE MAIL FILE
RETSKP ;RETURN TRUE
OUTERR: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred while transmitting mail file/]]
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL NETERR ;INFORM MX OF THE NETWORK ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;NETWORK ERROR
SKIPE FSTPSS(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEES RECEIVED MAIL
MOVEM T1,5(WRKREQ) ;PLACE IN THE WORK REQUEST BLOCK
JRST COMRET ;RETURN FALSE
REAERR: MOVE T1,FGWRD2 ;GET THE FLAG WORD
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL FILERR ;INFORM MX OF THE ERROR
ADJSP P,-1 ;RESET THE STACK
MOVEI T1,$REJECT ;NO ONE RECEIVED THIS MAIL
MOVEM T1,5(WRKREQ) ;PLACE IN WORK REQUEST BLOCK
COMRET: PUSH P,T1 ;SAVE THE STATUS
CALL MAICLO ;CLOSE THE MAIL FILE
POP P,T1 ;RESTORE THE STATUS
RET ;RETURN FALSE
FGWRD2: EXP FLD(1,1B3)!FLD($MESSA,37777B17)!FLD(1,1B18)!FLD(UF$FRF,37777B32)!FLD($ERR,7B35)
TOPLIN: BYTE(8) " "," "," ","=","=","=","=","=","=","=","="
SNDLIN: BYTE(8) " "," "," "," "," "," "," "," "," "," "," "
SUBTTL SFMSG PICK UP THE SUCCESS/FAIL MESSAGES FROM THE VAX
;INITIALIZE
SFMSG: MOVE T7,FSRCPT(VARPTR) ;POINT TO THE FIRST ADDRESSEE
MOVN T14,NUMSUC(VARPTR) ;NEGATIVE NUMBER OF RECIPIENTS
HRRZ T5,BUFPTR(VARPTR) ;MESSAGE ADDRESS
PUSH P,DATLNK(VARPTR) ;DATA LINK NUMBER
PUSH P,[^D16] ;NUMBER OF BYTES IN THE BUFFER
PUSH P,BUFPTR(VARPTR) ;BUFFER POINTER
SFLOOP: MOVE T6,1(T7) ;GET THE ADDRESSEE FLAG WORD
TXZE T6,REJECT ;REJECTED PREVIOUSLY BY THE VAX?
JRST [ MOVEM T6,1(T7) ;YES, STORE THE UPDATED FLAG WORD
HRRZ T7,0(T7) ;GET THE NEXT ADDRESSEE
JRST SFLOOP ] ;CHECK THIS ONE'S FLAG WORD
CALL UN%REA ;GET THE NEXT MESSAGE
JUMPLE T1,SFERR ;NETWORK ERROR OCCURRED
HRRZ T5,BUFPTR(VARPTR) ;GET THE ADDRESS OF THE MESSAGE
MOVE T2,0(T5) ;PICK UP THE MESSAGE
TLNN T2,SUCBIT ;SUCCESS MESSAGE?
JRST ADRFAI ;NO, INFORM MX
TXO T6,DELVER ;SET THE MAIL DELIVERED BIT
MOVEM T6,1(T7) ;STORE IN ADDRESSEE FLAG WORD
JRST NEXTAD ;GET THE NEXT ADDRESSEE
ADRFAI: SETOM FALSND(VARPTR) ;NOT ALL RECIPIENTS RECEIVED MAIL
;GET THE ERROR TEXT MESSAGE
HRRZ T1,BUFPTR(VARPTR) ;ADDRESS OF THE ERROR MESSAGE
MOVE T2,T1 ;SAVE A COPY FOR THE BLT
SETZM 0(T1) ;ZERO THE FIRST WORD FOR THE BLT
HRLS T1 ;STARTING ADDRESS IN LEFT
AOS T1 ;DESTINATION ADDRESS IN RIGHT
BLT T1,^D99(T2) ;ZERO THE BUFFER
PUSH P,DATLNK(VARPTR) ;DATA LINK NUMBER
PUSH P,[^D400] ;NUMBER OF BYTES IN THE BUFFER
PUSH P,BUFPTR(VARPTR) ;POINTER TO THE BUFFER
CALL UN%REA ;CHECK FOR CONFIRMATION
JUMPLE T1,SFERR ;RETURN, A NETWORK ERROR OCCURRED
ADJSP P,-3 ;ADJUST THE STACK
MOVE T1,BUFPTR(VARPTR) ;GET 8 BIT BYTE POINTER FOR ERROR
HRRZ T2,SNDERR(VARPTR) ;ADDRESS OF 7 BIT BYTE ERROR MESSAGE
MOVE T3,T2 ;SAVE FOR THE BLT
SETZM 0(T2) ;ZERO OUT THE FIRST WORD
HRLS T2 ;PUT ADDRESS IN BOTH HALVES
AOS T2 ;SET UP FOR THE BLT
BLT T2,^D69(T3) ;ZERO OUT THE ENTIRE ERROR BUFFER
MOVE T2,SNDERR(VARPTR) ;POINTER TO 7 BIT BYTE ERROR MESSAGE
MOVE T4,T2 ;SAVE FOR INFORMING MX OF THE ERROR
FNDREA: ILDB T3,T1 ;GET THE NEXT 8 BIT BYTE
IDPB T3,T2 ;PLACE IN THE ASCIZ STRING
CAIE T3,0 ;FINISHED?
JRST FNDREA ;NO, GET THE NEXT BYTE
PUSH P,T4 ;YES, PASS AS AN ARGUMENT
CALL ADRERR ;INFORM MX OF THE ADDRESSEE REJECTION
ADJSP P,-1 ;RESET THE STACK
NEXTAD: HRRZ T7,0(T7) ;GET THE NEXT ADDRESSEE
AOJL T14,SFLOOP ;GET THE NEXT MESSAGE
ADJSP P,-3 ;RESET THE STACK
MOVE T14,NUMSUC(VARPTR) ;GET THE NUMBER OF SUCCESSFULL SENDS
CAIL T14,MAXSND ;IS IT THE MAXIMUM?
RETSKP ;YES, FINISH WITH THIS PASS
SKIPN T7 ;MORE ADDRESSESS?
RETSKP ;NO, FINISH WITH THIS PASS
MOVEM T7,FSRCPT(VARPTR) ;ADDRESS OF FIRST ADDRESSEE
CALL ZREJEC ;ZERO ANY REJECT BITS
RETSKP ;FINISHED
SFERR: MOVEI T1,DSTNDE(VARPTR) ;ADDRESS OF THE NODE NAME
HRLI T1,(POINT 7) ;MAKE INTO A POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
MOVE T1,[POINT 7,[ASCIZ/occurred during recipient confirmation of recieving mail/]]
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL NETERR ;INFORM MX OF THE NETWORK ERROR
ADJSP P,-2 ;RESET THE STACK
MOVEI T1,$DEFER ;NETWORK ERROR OCCURRED
SKIPE RCPT(VARPTR) ;FIRST PASS?
MOVEI T1,$REJECT ;NO, SO SOME ADDRESSEES RECEIVED MAIL
MOVEM T1,5(WRKREQ) ;PLACE IN THE WORK REQUEST BLOCK
ADJSP P,-3 ;RESET THE STACK
CALL RSTPKT
RET ;RETURN AN ERROR
SUBTTL CLOLIN CLOSE THE CONNECTION
CLOLIN: PUSH P,DATLNK(VARPTR) ;DATA LINK
PUSH P,[0] ;NO OPTIONAL DATA
PUSH P,[0] ;NO OPTIONAL DATA POINTER
CALL UN%CLO ;CLOSE THE LINK
ADJSP P,-3 ;RESET THE STACK
MOVEI T1,$DONE ;EVERYONE RECEIVED MAIL
SKIPE FALSND(VARPTR) ;REALLY?
MOVEI T1,$REJECT ;NO, INDICATE SO
MOVEM T1,5(WRKREQ) ;SAVE IN THE WORK REQUEST BLOCK
RET
ABTLNK: PUSH P,DATLNK(VARPTR) ;DATA LINK
PUSH P,[.DCX11] ;UNDEFINED ERROR
PUSH P,[0] ;NO OPTIONAL DATA
PUSH P,[0] ;NO OPTIONAL DATA POINTER
CALL UN%ABO ;ABORT THE LINK
ADJSP P,-4 ;RESET THE STACK
RET
CSLINK: PUSH P,DATLNK(VARPTR) ;DATA LINK
PUSH P,[0] ;NO OPTIONAL DATA
PUSH P,[0] ;NO OPTIONAL DATA POINTER
CALL UN%CLO ;CLOSE THE LINK
ADJSP P,-3 ;RESET THE STACK
SKIPLE T1 ;ERROR?
RET ;NO, SO RETURN NOW
PUSH P,DATLNK(VARPTR) ;DATA LINK
PUSH P,[.DCX11] ;UNDEFINED ERROR
PUSH P,[0] ;NO OPTIONAL DATA
PUSH P,[0] ;NO OPTIONAL DATA POINTER
CALL UN%ABO ;ABORT THE LINK
ADJSP P,-4 ;RESET THE STACK
RET
;CLOSE THE MAIL FILE
MAICLO: PUSH P,FILNB(VARPTR) ;FILE NUMBER OF THE MAIL FILE
PUSH P,[0] ;DO NOT ABORT THE FILE
PUSH P,[0] ;NO ERROR STRING
CALL UF%CLO ;CLOSE AND DELETE THE MAIL FILE
ADJSP P,-3 ;RESET THE STACK
SKIPE T1 ;AN ERROR OCCURRED
JRST MAIRET ;RETURN
MOVE T1,FGWRD3 ;GET THE FLAG WORD
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL FILERR ;INFORM MX OF THE MAIL FILE ERROR
ADJSP P,-1 ;RESET THE STACK
MAIRET: RET
FGWRD3: EXP FLD(1,1B3)!FLD($MESSA,37777B17)!FLD(1,1B18)!FLD(UF$FCF,37777B32)!FLD($ERR,7B35)
;RESET THE REJECTED BIT OF ADDRESSESS UPON AN ERROR
ZREJEC: SETZ T2, ;ZERO THE FLAG WORD
TXO T2,REJECT ;LIGHT THE REJECT BIT
MOVE T1,FSRCPT(VARPTR) ;PICK UP FIRST ADDRESSEE OF THIS PASS
RESERR: ANDCAM T2,1(T1) ;ZERO OUT THE REJECTED BIT
HRRZ T1,0(T1) ;GET THE NEXT ADDRESSEE
CAIE T1,0 ;LAST ONE?
JRST RESERR ;NO
RET ;YES
SUBTTL ERROR HANDLING ROUTINES
;THIS ROUTINE INFORMS MX OF ANY NETWORK ERRORS THAT OCCURRED
NETERR: MOVEI T1,ERRBLK ;GET ADDRESS OF THE ARGUMENT BLOCK
MOVE T2,-1(P) ;GET THE REASON FOR ERROR POINTER
MOVEM T2,6(T1) ;PLACE IN THE SECOND ARGUMENT BLOCK
MOVE T2,-2(P) ;GET THE NODE NAME POINTER
MOVEM T2,5(T1) ;PLACE IN THE FIRST ARGUMENT BLOCK
MOVE T2,2(WRKREQ) ;GET THE I.D.
MOVEM T2,2(T1) ;PLACE IN THE ARGUMENT BLOCK
HRLS T1 ;START OF WHAT TO PUT ON THE STACK
HRRI T1,1(P) ;WHERE TO PUT ON THE STACK
BLT T1,7(P) ;PLACE ON THE STACK
MOVEI T1,1(P) ;ADDRESS OF THE ARGUMENT BLOCK
ADJSP P,7 ;UPDATE THE STACK POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL ER%PRC ;INFORM MX OF THE USER REJECTION
ADJSP P,-10 ;RESET THE STACK POINTER
RET
;A MAIL FILE ERROR OCCURED EITHER IN OPENING, READING OR CLOSING
FILERR: MOVEI T1,FILBLK ;GET ADDRESS OF THE ARGUMENT BLOCK
MOVE T2,MAIPTR(VARPTR) ;FILE SPEC POINTER
MOVEM T2,5(T1) ;PLACE IN THE ARGUMENT BLOCK
MOVE T2,-1(P) ;GET THE FLAG WORD
MOVEM T2,1(T1) ;PLACE IN THE ARGUMENT BLOCK
MOVE T2,2(WRKREQ) ;GET THE I.D.
MOVEM T2,2(T1) ;PLACE IN THE ARGUMENT BLOCK
HRLS T1 ;FIRST WORD TO COPY TO THE STACK
HRRI T1,1(P) ;WHERE TO PLACE 1ST WORD ON THE STACK
BLT T1,6(P) ;PLACE ON THE STACK
MOVEI T1,1(P) ;ADDRESS OF THE BLOCK
ADJSP P,6 ;ADJUST THE STACK FOR THE ARG. BLOCK
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL ER%PRC ;INFORM MX OF THE ERROR
ADJSP P,-7 ;RESET THE STACK
RET
;AN ADDRESSEE WAS REJECTED BY THE VAX
ADRERR: MOVEI T1,ADRBLK ;GET ADDRESS OF THE ARGUMENT BLOCK
MOVE T2,-1(P) ;GET THE ADDRESSEE POINTER
MOVEM T2,5(T1) ;PLACE IN THE ARGUMENT BLOCK
MOVE T2,2(WRKREQ) ;GET THE I.D.
MOVEM T2,2(T1) ;PLACE IN THE ARGUMENT BLOCK
HRLS T1 ;START OF WHAT TO PUT ON THE STACK
HRRI T1,1(P) ;WHERE TO PUT ON THE STACK
BLT T1,6(P) ;PLACE ON THE STACK
MOVEI T1,1(P) ;ADDRESS OF THE ARGUMENT BLOCK
ADJSP P,6 ;UPDATE THE STACK POINTER
PUSH P,T1 ;PASS AS AN ARGUMENT
CALL ER%PRC ;INFORM MX OF THE USER REJECTION
ADJSP P,-7 ;RESET THE STACK POINTER
RET
SUBTTL BUFREL RELEASE THE BUFFERS
;RELEASE SPACE FOR THE CONNECT BLOCK
BUFREL: MOVE T1,CNNBLK(VARPTR) ;ADDRESS OF THE CONNECTION BLOCK
PUSH P,T1 ;PASS AS AN ARGUMENT
PUSH P,[CBKSIZ] ;SIZE OF THE CONNECTION BLOCK
CALL UM%REL ;RELEASE THE SPACE
ADJSP P,-2 ;RESET THE STACK
;RELEASE THE SPACE FOR THE TO: LIST
HRRZ T1,TOLIST(VARPTR) ;ADDRESS OF THE TO: LIST BUFFER
PUSH P,T1 ;PASS AS AN ARGUMENT
PUSH P,[^D70] ;SIZE OF THE TO: LIST BUFFER
CALL UM%REL ;RELEASE THE SPACE
ADJSP P,-2 ;RESET THE STACK
;RELEASE SPACE FOR THE FROM STRING (8 BIT)
HRRZ T1,SNDSTR(VARPTR) ;ADDRESS OF FROM STRING BUFFER
PUSH P,T1 ;PASS AS AN ARGUMENT
PUSH P,[^D70] ;SIZE OF THE FROM STRING BUFFER
CALL UM%REL ;RELEASE THE SPACE
ADJSP P,-2 ;RESET THE STACK
;RELEASE SPACE FOR THE FROM STRING (7 BIT)
HRRZ T1,SNDERR(VARPTR) ;ADDRESS OF FROM STRING BUFFER
PUSH P,T1 ;PASS AS AN ARGUMENT
PUSH P,[^D70] ;SIZE OF THE FROM STRING BUFFER
CALL UM%REL ;RELEASE THE SPACE
ADJSP P,-2 ;RESET THE STACK
;RELEASE SPACE FOR THE WORKING BUFFER
HRRZ T1,WRKBUF(VARPTR) ;ADDRESS OF THE WORKING BUFFER
PUSH P,T1 ;PASS AS AN ARGUMENT
PUSH P,[^D100] ;SIZE OF THE WORKING BUFFER
CALL UM%REL ;RELEASE THE SPACE
ADJSP P,-2 ;RESET THE STACK
;RELEASE SPACE FOR LIST OF ADDRESSES AND POINTERS
PUSH P,VARPTR ;ADDRESS OF ADDRESS LIST
PUSH P,[NUMVAR] ;SIZE OF ADDRESS LIST
CALL UM%REL ;RELEASE THE SPACE
ADJSP P,-2 ;RESET THE STACK
RET
;A RECIPIENT WAS REJECTED, RESET ALL DELIVERED BITS
RSTPKT: SETZ T1,0 ;ZERO THE FLAG WORD
TXO T1,DELVER ;LITE THE DELIVERED BIT
RSTPK2: ANDCAM T1,1(T7) ;TURN OFF THE DELIVERED BIT
HRRZ T7,0(T7) ;GET THE NEXT RECIPIENT
CAIE T7,0 ;IS THIS THE LAST ONE?
JRST RSTPK2 ;NO, GO TURN OFF THE DELIVERED BIT
RET ;YES, GO CLOSE THE LINK
RSKP: AOS 0(P)
R: RET
END