Trailing-Edge
-
PDP-10 Archives
-
SRI_NIC_PERM_SRC_3_19910112
-
mm-new/wakeup.mac
There are 5 other files named wakeup.mac in the archive. Click here to see a list.
TITLE WAKEUP - Wakeup MMailr module for TOPS-20 mailsystem
SUBTTL Mark Crispin 25 March 1985
; Copyright (c) 1985 Mark Crispin. All Rights Reserved.
SEARCH MACSYM,MONSYM ; system definitions
SALL ; suppress macro expansions
.DIRECTIVE FLBLST ; sane listings for ASCIZ
A=1 ; JSYS, temp AC's
B=2
C=3
D=4
IFNDEF IPCBLN,IPCBLN==20 ; length of IPCF buffer
.PSECT DATA
MYPID: 0 ; my IPCF PID
.ENDPS
.PSECT CODE
; Send a wakeup call to MMailr
; CALL $WAKE
; Returns +1: Always
$WAKE:: SAVEAC <A,B,C>
STKVAR <<IPCBLK,.IPCFP+1>,<IPCBUF,IPCBLN>>
DO.
SKIPE B,MYPID ; have a PID already?
TDZA A,A ; yes, use it
MOVX A,IP%CPD ; no, create a PID
MOVEM A,.IPCFL+IPCBLK
MOVEM B,.IPCFS+IPCBLK ; PID to use if one there
SETZM .IPCFR+IPCBLK ; send to INFO
MOVSI A,.IPCI2+3 ; length of INFO msg
HRRI A,IPCBUF ; where INFO msg is
MOVEM A,.IPCFP+IPCBLK
MOVX A,.IPCIW ; return PID associated with name
MOVEM A,.IPCI0+IPCBUF
SETZM .IPCI1+IPCBUF ; duplicate copy not needed
DMOVE A,[ASCII/[SYSTEM]MM/] ; 1st part of PID to look up
DMOVEM A,.IPCI2+IPCBUF
MOVE A,[ASCII/AILR/] ; 2nd part of PID to look up
MOVEM A,.IPCI2+2+IPCBUF
MOVX A,.IPCFP+1 ; length of block
MOVEI B,IPCBLK ; get MMailr's PID
MSEND%
IFJER.
SKIPE MYPID ; had a PID?
CAIE A,IPCFX9 ; yes, "Sender's PID invalid"?
RET ; no PID or some other error, go away
SETZM MYPID ; no PID any more
LOOP. ; try again, creating a PID this time
ENDIF.
ENDDO.
MOVE A,.IPCFS+IPCBLK ; get the PID I made
MOVEM A,MYPID ; remember it for next time
DO.
SETZM .IPCFL+IPCBLK ; no flags
SETZM .IPCFS+IPCBLK ; any sender
MOVE A,MYPID ; I'm the receiver
MOVEM A,.IPCFR+IPCBLK
MOVSI A,IPCBLN ; place to put the reply
HRRI A,IPCBUF
MOVEM A,.IPCFP+IPCBLK
MOVX A,.IPCFP+1 ; length of block
MOVEI B,IPCBLK ; get reply from INFO
MRECV%
ERJMP R ; failure irrelevant here
LOAD A,IP%CFC,.IPCFL+IPCBLK ; 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>,.IPCFL+IPCBLK,R ; give up if undeliverable
SETZM .IPCFL+IPCBLK ; no flags
MOVE A,MYPID ; I'm the sender
MOVEM A,.IPCFS+IPCBLK
MOVE A,.IPCI1+IPCBUF ; MMailr is the recipient
MOVEM A,.IPCFR+IPCBLK
MOVSI A,1 ; one word from IPCBUF
HRRI A,IPCBUF
MOVEM A,.IPCFP+IPCBLK
MOVX A,'PICKUP' ; magic word to wake up MMailr
MOVEM A,IPCBUF
MOVX C,^D20
DO.
MOVX A,.IPCFP+1 ; length
MOVEI B,IPCBLK ; send wakeup to MMailr
MSEND%
IFJER.
MOVX A,^D1000 ; failed, wait a bit
DISMS%
SOJG C,TOP. ; try a few times
RET ; failed, give up
ENDIF.
ENDDO.
MOVX A,.MUQRY ; query function for MUTIL%
MOVEM A,IPCBUF
MOVE A,MYPID ; query packets for our PID
MOVEM A,1+IPCBUF
MOVX C,^D20 ; number of retries
DO.
MOVX A,.IPCFP+2 ; number of words to return
MOVEI B,IPCBUF ; argument block in IPCBUF
MUTIL%
IFJER.
MOVX A,^D1000 ; wait a bit
DISMS%
SOJG C,TOP. ; retry a few times
RET
ENDIF.
ENDDO.
DO.
SETZM .IPCFL+IPCBLK ; no flags
SETZM .IPCFS+IPCBLK ; sender is filled in by monitor
MOVE A,MYPID ; I'm the receiver
MOVEM A,.IPCFR+IPCBLK
MOVSI A,IPCBLN ; where MMailr reply will go
HRRI A,IPCBUF
MOVEM A,.IPCFP+IPCBLK
MOVX A,.IPCFP+1 ; size of block
MOVEI B,IPCBLK ; get reply from MMailr
MRECV%
ERJMP .+1 ; error uninteresting here
IFQN. IP%CFC,.IPCFP+IPCBLK ; get sender code
CAIE B,.IPCCF ; from <SYSTEM>INFO
CAIN B,.IPCCP ; or private <SYSTEM>INFO?
LOOP. ; yes, try for another message
ENDIF.
ENDDO.
RET
END