.TITLE MAILNOT- NOTIFY USER OF RECEIVED MAIL .IDENT /V1.1/ ;+ ; MAILNOT - Ancilliary task to notify user that mail has arrived ; ; Written for use with the DECnet mail, VMS format. ; Adopted from the Alberta Research Mail system. ; ; MODIFICATIONS: ; ; CODE NAME DATE ; DJM David Mitton 12/10/79 Changed for network server ; DJM David Mitton 4/23/80 Look for HT's, add return message ; DJM David Mitton 5/14/81 Added From text, node name call ;- .MCALL ALUN$S,QIO$S,WTLO$S,MRKT$S .MCALL RCVX$S,WTSE$S,ASTX$S,CMKT$S .MCALL SDAT$S,USTP$S .MCALL OPNW$S,GLNW$S TLUN=1 TEVF=1 MEVF=2 NTLUN=3 ; ; NOTE: CURRENT VERSION DOES WRITE BREAKTHROUGH, PREVIOUSLY WAITED FOR A CHANCE ; ; THROUGHOUT, R2 CONTAINS THE TT DCB POINTER ; CYCLE=10. ; THE NUMBER OF SECONDS TO ELAPSE BETWEEN AN ; UNSUCCESSFUL MESSAGE OUTPUT, AND THE NEXT TRY. ; IE. THE CYCLE TIME. ; SPEED=30. ; THE RECEIVING SPEED (IN CHARACTERS PER SECOND) ; OF THE SLOWEST TERMINAL TO WHICH A MESSAGE ; WOULD BE SENT. ; COUNT=6. ; THE NUMBER OF TIMES TO ATTEMPT TO ISSUE THE ; MESSAGE TO A BUSY TERMINAL. ; OURNAM: .RAD50 /MAL.../ ;THIS SHOULD BE OUR TASK NAME ; + ; Entry point ; remove message from task's queue ; - MAIL$:: RCVX$S ,#BUF ;GET WHAT'S SENT TO US MOV #FRM,R0 ; move the from name to the message. MOV #FROM,R1 MOV #24.,R2 5$: MOVB (R0)+,(R1)+ DEC R2 BGT 5$ ; get the node name ALUN$S #NTLUN,#"NS OPNW$S #NTLUN,#NTLUN ;OPEN THE NETWORK GLNW$S #NTLUN,#NTLUN,,,<#NODE,#6> ;GET THE NODE NAME CLR R2 ;AT START, DCB UNKOWN MOV SUIC,R5 ; GET THE UIC ; ; FIND OUT WHO ALL IS LOGGED ON... ; 10$: INC BUF+6 ;ADD TO THE OVERALL COUNT MOV #TERBLK,R3 ;TERMINAL DESCRIPTION BLOCK CLR 2(R3) ;START WITH TT0: 20$: CALL GTUCB ;GET THE TERMINAL'S UCB BCS 25$ ;IF CS, THEN NO MORE TERMS AVAIL. CALL MAIMSG ;TELL HIM ABOUT IT 23$: INC 2(R3) ;TRY THE NEXT BR 20$ ; TERMINAL. 25$: CMP R3,#HTBLK ;HAVE WE TRYED HT'S TOO? BEQ 30$ ;YES, ALL DONE MOV #HTBLK,R3 ;NO, SET IT UP CLR 2(R3) ; BR 20$ ;GO BACK AND LOOK FOR HT'S NOW 30$: ;SDAT$S #BUF,#DONBUF ;SEND ALL-DONE MESSAGE TO SERVER ; USTP$S #BUF ;UNSTOP IT BR MAIL$ ;AND TRY FOR MORE ;+ ; ; MAIMSG - ROUTINE TO OUTPUT THE MESSAGE THAT THE USER WAS ; GIVEN MAIL. ; ;- MAIMSG: ALUN$S #TLUN,(R3),2(R3) QIO$S #IO.WBT,#TLUN,#TEVF,,,,<#MESS,#LMESS> MRKT$S #MEVF,#MTIME,#2,#AST ;WAIT FOR A WHILE WTLO$S 0,# CMKT$S ;CAN MRKT REQUEST ; MOV (R3),BUF+16 ;GET TERMINAL ID ; MOV 2(R3),BUF+20 ;and unit number ; SDAT$S #BUF,#BUF+4 ;SEND BUFFER BACK RETURN ; .ENABL LC MESS: .ASCII <15><12><7>/New mail on node / NODE: .BLKB 6 .ASCII / from / FROM: .BLKB 25. .ASCII <7><15> LMESS =.-MESS .EVEN ; ; MTIME = LMESS+10./SPEED+1 ; WAIT THIS LONG FOR THE QIO ; ; DONBUF: .WORD 0 BUF: .BLKW 2 ;TASK NAME OF SENDER SUIC: .BLKW 1 ;UIC OF MAIL RECIPIENT FRM: .BLKB 24. ;FROM USER STRING ; ; AST - THE MARK TIME AST. ; ; EXECUTION OF THIS AST IMPLIES A QIO TIME OUT ; AST: QIO$S #IO.KILL,#TLUN ;KILL THE I/O 1$: TST (SP)+ ; ASTX$S ; ; GTUCB -- ROUTINE TO OBTAIN THE ADDRESS OF THE ; DESIRED UCB. ; ; INPUTS: R2 = DCB ADDRESS ; R3 = ADDRESS OF 2-WORD TERMINAL DESCRIP. ; (R3) = ASCII MNEUMONIC ; 2(R3) = UNIT NUMBER ; ; USAGE REQUIRES THE TASK TO BE PRIVILEGED ; ; OUTPUTS: R1 = ADDRESS OF THE UCB ; R2 = ADDRESS OF THE DCB ; R3 = UNCHANGED ; TERBLK: .ASCII /TT/ .WORD 0 HTBLK: .ASCII /HT/ .WORD 0 GTUCB: MOV R0,-(SP) ;PUSH SOME REGISTERS MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) CMP 2(R3),#256. ;UNIT IN RANGE? BLO 10$ ;YES, PROCEED SEC ;NO IT AIN'T BR 100$ ;FERGET IT ; 10$: CALL $SWSTK,100$ ;SWITCH TO SYSTEM STATE MOV 6(SP),R2 ;GET THE USER'S R2 BNE 12$ ;A DCB IS THERE MOV $DEVHD,R2 ;GET ADDRESS OF DEVICE TABLE 12$: CMP (R3),D.NAM(R2) ;IS THIS THE DEVICE? BEQ 20$ ;YES IT IS 15$: MOV D.LNK(R2),R2 ;NO, POINT TO NEXT DCB BNE 12$ ;GOT ONE BEQ 50$ ;END OF DEVICES, ERROR 20$: MOV 2(R3),R5 ;GET THE UNIT NUMBER CMPB R5,D.UNIT(R2) ;IS UNIT ON THIS DCB? BLO 15$ ;NO CMPB R5,D.UNIT+1(R2) ;MAYBE? BHI 15$ ;NO MOVB D.UNIT(R2),R4 ;GET FIRST UNIT NUMBER MOV D.UCB(R2),R1 ;GET FIRST UCB ADDRESS SUB R4,R5 ;COMPUTE RELATIVE UNIT NUMBER BEQ 45$ ;FOUND IT! 30$: ADD D.UCBL(R2),R1 ;NO, POINT TO NEXT UCB DEC R5 ;FOUND IT YET? BNE 30$ ;NO, LOOP 45$: BIT #U2.LOG,U.CW2(R1) ;LOGGED IN? BNE 23$ ;IF NE, NO CMP U.LUIC(R1),BUF+4 ;DID HE GET MAIL? BEQ 48$ ;IF EQ, YES TELL HIM 23$: INC 2(R3) ;TRY THE NEXT BR 20$ ; TERMINAL. 48$: MOV R1,4(SP) ;SET USER R1 MOV R2,6(SP) ;SET USER R2 RETURN ;RETURN TO USER STATE 50$: MOV @$HEADR,R3 ;GET USER SP INCB 6(R3) ;SET CARRY IN USER PS RETURN ;RETURN TO USER STATE ; 100$: MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R0 RETURN .END MAIL$