Google
 

Trailing-Edge - PDP-10 Archives - mit_emacs_170_teco_1220 - emacs/wakemm.mac
There are no other files named wakemm.mac in the archive.
TITLE WAKEMM - Wake up MMAILR to deliver mail
SEARCH MONSYM,MACSYM
ASUPPRESS

A=1
B=2
C=3
D=4

MYPID:	BLOCK 1			; IPCF PID for talking to the world
IPCBLK:	BLOCK .IPCFP+1		; Block for IPCF transactions
TEMP:	BLOCK 100		; Temporary storage

START:	RESET%			; Initialize the world
	MOVX A,IP%CPD		; Creating a PID
	MOVEM A,IPCBLK+.IPCFL
	SETZM B,IPCBLK+.IPCFS	; No PID yet
	SETZM IPCBLK+.IPCFR	; Send to INFO
	MOVX A,<.IPCI2+3,,TEMP> ; Length of INFO msg,,where INFO msg is
	MOVEM A,IPCBLK+.IPCFP
	MOVX A,.IPCIW		; Return PID associated with name
	MOVEM A,TEMP+.IPCI0
	SETZM TEMP+.IPCI1	; Duplicate copy not needed
	DMOVE A,[ASCII/[SYSTEM]MM/] ; 1st part of PID to look up
	DMOVEM A,TEMP+.IPCI2
	MOVE A,[ASCII/AILR/]	; 2nd part of PID to look up
	MOVEM A,TEMP+.IPCI2+2
	MOVX A,.IPCFP+1		; Length of block
	MOVEI B,IPCBLK		; Get MMailr's PID
	MSEND%
	 ERJMP DONE		; Looks like INFO isn't there
	MOVE A,IPCBLK+.IPCFS	; Get the PID I made
	MOVEM A,MYPID		; Remember it for next time
	DO.
	  SETZM IPCBLK+.IPCFL	; No flags
	  SETZM IPCBLK+.IPCFS	; Any sender
	  MOVE A,MYPID		; I'm the receiver
	  MOVEM A,IPCBLK+.IPCFR
	  MOVX A,<10,,TEMP>	; Place to put the reply
	  MOVEM A,IPCBLK+.IPCFP
	  MOVX A,.IPCFP+1	; Length of block
	  MOVEI B,IPCBLK	; Get reply from INFO
	  MRECV%
	   ERJMP DONE		; Failure irrelevant here
	  LOAD A,IP%CFC,IPCBLK+.IPCFL ; See who sent message
	  CAIE A,.IPCCC		; From <SYSTEM>IPCF?
	   CAIN A,.IPCCF	; No, from <SYSTEM>INFO?
	   IFSKP.
	     LOOP.		; No, get another message
	   ENDIF.
	ENDDO.
	JN <IP%CFE,IP%CFM>,IPCBLK+.IPCFL,DONE ; give up if undeliverable

	SETZM IPCBLK+.IPCFL	; No flags
	MOVE A,MYPID		; I'm the sender
	MOVEM A,IPCBLK+.IPCFS
	MOVE A,TEMP+.IPCI1	; MMailr is the recepient
	MOVEM A,IPCBLK+.IPCFR
	MOVX A,<1,,TEMP>	; One word from scratch buffer
	MOVEM A,IPCBLK+.IPCFP
	MOVX A,'PICKUP'		; Magic word to wake up MMailr
	MOVEM A,TEMP
	MOVX C,^D20
	DO.
	  MOVX A,.IPCFP+1	; Length
	  MOVEI B,IPCBLK	; Send START to MMailr
	  MSEND%
	  IFJER.
	    MOVEI A,^D1000	; Failed, wait a bit
	    DISMS%
	    SOJG C,TOP.		; Try a few times
	    JRST DONE
	  ENDIF.
	ENDDO.

	MOVX A,.MUQRY		; Query function for MUTIL%
	MOVEM A,TEMP
	MOVE A,MYPID		; Query packets for our PID
	MOVEM A,TEMP+1
	MOVX C,^D20		; Number of retries
	DO.
	  MOVX A,.IPCFP+2	; Number of words to return
	  MOVEI B,TEMP		; Argument block in scratch buffer
	  MUTIL%
	  IFJER.
	    MOVEI A,^D1000	; Wait a bit
	    DISMS%
	    SOJG C,TOP.		; Retry a few times
	    JRST DONE
	  ENDIF.
	ENDDO.
	DO.
	  SETZM IPCBLK+.IPCFL	; No flags
	  SETZM IPCBLK+.IPCFS	; Sender is filled in by monitor
	  MOVE A,MYPID		; I'm the receiver
	  MOVEM A,IPCBLK+.IPCFR
	  MOVX A,<10,,TEMP>	; Where MMailr reply will go
	  MOVEM A,IPCBLK+.IPCFP
	  MOVX A,.IPCFP+1	; Size of block
	  MOVEI B,IPCBLK	; Get reply from MMailr
	  MRECV%
	   ERJMP .+1		; Error uninteresting here
	  LOAD A,IP%CFC,IPCBLK+.IPCFP ; Get sender code
	  IFN. A		; Special sender?
	    CAIE B,.IPCCF	; From <SYSTEM>INFO
	     CAIN B,.IPCCP	; Or private <SYSTEM>INFO?
	      LOOP.		; Yes, try for another message
	  ENDIF.
	ENDDO.
DONE:	HALTF%
	JRST START

	END START