1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-04-20 00:43:22 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

1332 lines
45 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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