;11S NODE LINE WATCHER TASK(NWT.MAC) ; ; PAUL ELKINS 1-MAR-85 ; ; LOS ALAMOS NATIONAL LAB. ; PO BOX 1663 MS-J957 ; LOS ALAMOS NM 87545 ; 505 667 3502 ; ; ; ;COPYRIGHT, 1984,THE REGENTS OF THE UNIVERSITY OF CALIFORNIA. ;THIS SOFTWARE WAS PRODUCED UNDER A U.S. GOVERNMENT CONTRACT ;(W-7405-ENG-36) BY THE LOS ALAMOS NATIONAL LABORATORY,WHICH ;IS OPERATED BY THE UNIVERSITY OF CALIFORNIA FOR THE U.S. ;DEPARTMENT OF ENERGY. THE U.S. GOVERNMENT IS LICENSED TO USE, ;REPRODUCE, AND DISTRIBUTE THIS SOFTWARE. PERMISSION IS GRANTED ;TO THE PUBLIC TO COPY AND USE THIS SOFTWARE WITHOUT CHARGE, ;PROVIDED THAT THIS NOTICE AND ANY STATEMENT OF AUTHORSHIP ARE ;REPRODUCED ON ALL COPIES. NEITHER THE GOVERNMENT NOR THE ;UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ;ANY LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE. ; ;FLUSHES STALE PACKETS ; .TITLE NWT ; .LIST MEB .MCALL DIR$,QIO$,MRKT$,SDAT$,WTLO$S,RDAF$ .MCALL GTSK$S,SRDA$S,CLEF$S,SETF$S,QIOW$ .MCALL RCVD$,ASTX$S,GTIM$,STIM$ .MCALL XQPRCL,XQSYSC,XQSTAT ; .PSECT IDB6,RW,D,GBL,REL,OVR NODE: .BLKW 3 LINUP=NODE+2 ; .PSECT NWT ; XQPRCL ;DEFINE ETHERNET PROTOCOL XQSYSC ;DEFINE XQ: SYSTEM TYPE CODES XQSTAT ;DEFINE XQ: ERROR STATISTICS OFFSETS ; L1=1 ;ETHERNET LOGICAL UNIT NUMBER L2=2 ;CONSLOE LOG LOICAL UNIT NUMBER NBUF=1 ;NUMBER OF ETHERNET BUFFERS MKMSK=100000 ;MARK TIME EVENT FLAG MASK(16) RCMSK=40000 ;RECEIVE DATA EVENT FLAG MASK RECEF=15. ;RECEIVE DATA EVENT FLAG XEF=14. ;ETHERNET XMIT EVENT FLAG MRKTMG=20. ;MARKTIME TIME INTERVAL IN SECONDS BUFSZ=100 ;BUFFER SIZE IN BYTES NTSK=4 ;NUMBER OF TASKS TO SPAWN NLIN=2 ;NUMBER OF LINES TO FORMAT LINSZ=10 ;NUMBER OF WORDS PER LINE LDNOD=1 ;LOAD NODE ADDRESS(TIME STANDARD) MINWC=14. ;MINIMUM PACKET WORD COUNT ; START: GTSK$S #MYTSK ;GET MY TASK NAME DIR$ #GDPB ;GET MY NODE ADDRESS MOV MYNOD,MYID+XQSRC+4 ;INSERT MY NODE ADDRESS IN ID MESSAGE MOV MYTSK,MYID+XQSTSK ;INSERT MY TASK NAME IN ID MESSAGE MOV MYTSK+2,MYID+XQSTSK+2 ;INSERT TASK NAME WORD TWO SRDA$S #RECAST ;SPECIFY RECEIVE DATA AST CLR R0 ;INITIAL MASK VALUE MOV #NBUF,R1 ;NUMBER OF BUFFERS 1$: SEC ;BUILD XQ EVENT FLAG MASK ROL R0 ;POSITION TO NEXT SLOT SOB R1,1$ ;DONE ? MOV R0,XQMSK ;SAVE XQ EVENT FLAG MASK BIS #MKMSK!RCMSK,R0 ;RECEIVE DATA OR MARK TIME EVENT FLAG MOV R0,EFMSK ;ALL EVENT FLAGS MASK MOV #BUF,R5 ;STARTING BUFFER ADDRESS MOV #1,R4 ;BUFFER EVENT FLAG NUMBER MOV #NBUF,R0 ;GET NUMBER OF BUFFERS 3$: JSR PC,RDPKT ;POST ETHERNET RECEIVES ADD #BUFSZ,R5 ;NEXT BUFFER INC R4 ;NEXT BUFFER EVENT FLAG SOB R0,3$ ;DONE ? JSR PC,XQINOD ;INITIALIZE NODE CAMAC HARDWARE JSR PC,IXBUF ;SETUP XMIT BUFFER MOV #XQRTIM,XQSTYP(R5) ;REQUEST SYSTEM TIME FROM LDNOD JSR PC,SNDPKT ;SEND REQUEST MOV #MS3X,R0 ;INITIALIZE NODE MESSAGE CONTROL BLOCK JSR PC,TYPE ;TYPE IT DIR$ #MARK ;START MARK TIME ; ;WAIT FOR LOGICAL OR OF EVENT FLAGS ; 10$: WTLO$S 0,EFMSK ;WAIT ON LOGICAL OR OF EVENT FLAGS DIR$ #RDAF ;READ ALL EVENT FLAGS 15$: MOV EFBUF,R0 ;GET GROUP ZERO EVENT FLAGS BIT XQMSK,R0 ;ANY ETHERNET RECEIVES BNE 16$ ;YES CONTINUE BIT #MKMSK,R0 ;MARK TIME ? BEQ .+6 ;NO TRY RECEIVE DATA JMP 50$ ;YES BIT #RCMSK,R0 ;RECEIVE DATA ? BEQ 10$ ;NO RETURN TO WAIT FOR EVENT FLAGS JMP 60$ ;YES PROCESS IT 16$: MOV #BUF,R5 ;BUFFER STARTING ADDRESS MOV #1,R4 ;EVENT FLAG FOR FIRST BUFFER MOV #NBUF,R3 ;NUMBER OF BUFFERS MOV #1,R2 ;STARTING MASK BIT 17$: BIT R2,R0 ;FLAG SET ? BNE 18$ ;YES ASL R2 ;NO SHIFT TO NEXT POSITION INC R4 ;NEXT EVENT FLAG ADD #BUFSZ,R5 ;NEXT BUFFER SOB R3,17$ ;LOOP ON NUMBER OF BUFFERS JSR PC,ERR4 ;UNKNOWN ERROR ??? BR 15$ 18$: BIC R2,EFBUF ;CLEAR FLAG BIT CMP MYTSK,XQDTSK(R5) ;MY TASK NAME ? BNE 20$ ;NO FLUSH IT CMP MYTSK+2,XQDTSK+2(R5) ;MYTASK NAME(2) BNE 20$ ;NO FLUSH IT CMP #XQSYST,XQTYP(R5) ;XQ: SYSTEM REQUEST ? BNE 20$ ;NO FLUSH IT MOV XQSTYP(R5),R0 ;GET SUB-TYPE CODE CMP #XQECHO,R0 ;ECHO PACKET ? BEQ 30$ ;YES CMP #XQRTIM,R0 ;REQUEST SYSTEM TIME ? BEQ 35$ ;YES CMP #XQSTIM,R0 ;SET TIME REQUEST ? BEQ 40$ ;YES CMP #XQGTIM,R0 ;GET TIME REQUEST ? BEQ 45$ ;YES CMP #XQERR,R0 ;GET ERROR COUNTERS ? BEQ 55$ ;YES CMP #XQERRC,R0 ;GET AND CLEAR ERROR COUNTERS BEQ 56$ ;YES CMP #XQID,R0 ;NODE ID MESSAGE ? BEQ 25$ ;YES JSR PC,ERR2 ;ILLEGAL TYPE CODE BR 15$ ;MORE WORK ? ; ;FLUSH PACKET ; 20$: TST IOSB1 ;PRINTING LUN BUSY ? BEQ 24$ ;YES SKIP PRINTOUT MOV R4,-(SP) ;SAVE RDPKT EVENT FLAG MOV R5,-(SP) ;SAVE RDPKT BUFFER ADDRESS MOV #LINBUF,R4 ;LINE BUFFER POINTER MOV #NLIN,R3 ;NUMBER OF LINES TO PRINT 21$: MOV #LINSZ,R2 ;NUMBER OF WORDS PER LINE 22$: MOV (R5)+,R0 ;GET WORD TO FORMAT JSR PC,OCT ;CONVERT TO OCTAL STRING SOB R2,22$ ;LOOP ON WORD COUNT MOVB #15,(R4)+ ;STORE CARRIAGE RETURN MOVB #12,(R4)+ ;STORE LINE FEED SOB R3,21$ ;LOOP ON NUMBER OF LINES MOV #MS1X,R0 ;FLUSH PACKET MESSAGE CONTROL BLOCK JSR PC,TYPE ;TYPE FLUSH MESSAGE MOV (SP)+,R5 ;RESTORE RDPKT BUFFER ADDRESS MOV (SP)+,R4 ;RESTORE RDPKT EVENT FLAG 24$: JSR PC,RDPKT ;PACKET FLUSHED BR 15$ ; ;LOCAL NODE ID MESSAGE(XQID) ; 25$: BR 32$ ;IGNORE FOR NOW ; ;ECHO PACKET(XQECHO) ; 30$: JSR PC,SWAP ;SWAP TO-FROM FIELDS JSR PC,SNDPKT ;SEND PACKET AND WAIT 32$: JSR PC,RDPKT ;RE-POST RECEIVE BR 15$ ; ;REQUEST REMOTE SYSTEM TIME(XQRTIM) ; ;REPLY FROM NODE INITIALIZE REQUEST ; 35$: MOV R5,R0 ;GET BUFFER ADDRESS ADD #XQDAT,R0 ;ADD IN OFFSET TO DATA FIELD MOV R0,STIM+S.TIBA ;INSERT IN DPB DIR$ #STIM ;SET SYSTEM TIME JSR PC,RDPKT ;RE-POST RECEIVE BUFFER BR 51$ ;INDICATE LINE-UP ; ;SET NODE TIME(XQSTIM) ; 40$: MOV R5,R0 ;GET BUFFER ADDRESS ADD #XQDAT,R0 ;ADD IN OFFSET TO DATA AREA MOV R0,STIM+S.TIBA ;INSERT IN DPB DIR$ #STIM ;SET SYSTEM TIME BR 30$ ; ;READ NODE TIME(XQGTIM) ; 45$: MOV R5,R0 ;GET BUFFER ADDRESS ADD #XQDAT,R0 ;ADD IN OFFSET TO DATA AREA MOV R0,GTIM+G.TIBA ;INSERT IN DPB DIR$ #GTIM ;READ NODE TIME MOV #MINWC+8.,XQWC(R5) ;INSERT PROPER WORD COUNT BR 30$ ;SEND IT TO REQUESTOR ; ;MARK TIME ; 50$: DIR$ #MARK ;RE-POST MARK TIME DIR$ #GDPB ;WAKEUP DRIVER/GET RECEIVE PACKET COUNT MOV #MYID,R5 ;GET MYID MESSAGE BUFFER ADDRESS JSR PC,SNDPKT ;BROADCAST MY ID MESSAGE INC PASCTR ;INCREMENT PASS COUNTER BIT #1,PASCTR ;CHECK LINE STATUS ? BNE 53$ ;NO SKIP LINEUP TEST CMP LAST,RCNT ;LINE UP ? BNE 51$ ;YES CLR LINUP ;INDICATE LINE DOWN MOV #MS7X,R0 ;LINE DOWN MESSAGE CONTROL BLOCK BR 52$ 51$: MOV RCNT,LAST ;UPDATE LAST RECEIVE COUNT BIS #1,LINUP ;INDICATE LINE UP MOV #MS6X,R0 ;LINE UP MESSAGE CONTROL BLOCK 52$: CMP LINUP,LINSTA ;LINE STATUS CHANGE ? BEQ 53$ ;NO MOV LINUP,LINSTA ;YES UPDATE LINE STATUS JSR PC,TYPE ;TYPE NEW LINE STATUS 53$: JMP 10$ ; ;GET REMOTE XQ: STATUS(ERROR COUNTERS) ; 55$: MOV #IO.GLI,R0 ;GET LINK INFORMATION BR 57$ 56$: MOV #IO.GLC,R0 ;GET AND CLEAR LINK COUNTERS 57$: MOV R0,GERR+Q.IOFN ;INSERT FUNCTION CODE MOV R5,R0 ;GET BUFFER ADDRESS ADD #XQDAT,R0 ;ADD OFFSET TO DATA AREA MOV R0,GERR+Q.IOPL ;INSERT BUFFER ADDRESS IN DPB DIR$ #GERR ;GET ERROR INFORMATION MOV #STACNT/2+MINWC,XQWC(R5) ;INSERT WORD COUNT BR 30$ ;SEND IT TO REQUESTOR ; ;RECEIVE DATA ; 60$: MOV #MS5X,R0 ;GET ERROR MESSAGE CONTROL BLOCK JSR PC,TYPE CLEF$S #RECEF ;CLEAR RECEIVE DATA EVENT FLAG JMP 15$ ; ;TYPE ERROR MESSAGE ; ERR2: MOV #MS2X,R0 BR ERRX ERR4: MOV #MS4X,R0 ERRX: JSR PC,RDPKT JSR PC,TYPE ;TYPE IT RTS PC ; ;POST READ ETHERNET QIO(R5=BUFFER ADDRESS,R4=EVENT FLAG) ; RDPKT: MOV R5,RDPB+Q.IOPL ;INSERT BUFFER ADDRESS MOV R4,RDPB+Q.IOEF ;INSERT EVENT FLAG DIR$ #RDPB ;ISSUE READ QIO RTS PC ; ;SEND PACKET AND WAIT ; SNDPKT: MOV R5,XDPB+Q.IOPL ;STORE BUFFER ADDRESS DIR$ #XDPB ;SEND IT RTS PC ; ;SWAP ETHER NET BUFFER ; SWAP: MOV R5,R0 ;GET BUFFER ADDRESS CLR (R0)+ CLR (R0)+ MOV XQSRC+4(R5),(R0) ;STORE DESTINATION ADDRESS MOV MYNOD,XQSRC+4(R5) ;INSERT SOURCE NODE ADDRESS MOV XQSTSK(R5),XQDTSK(R5) MOV XQSTSK+2(R5),XQDTSK+2(R5) MOV MYTSK,XQSTSK(R5) MOV MYTSK+2,XQSTSK+2(R5) RTS PC ; ;INITIALIZE XMIT BUFFER ; IXBUF: MOV #XBUF,R5 MOV R5,R0 ;WORKING BUFFER ADDRESS MOV #BUFSZ/2,R1 ;BUFFER LENGTH 1$: CLR (R0)+ ;CLEAR BUFFER SOB R1,1$ MOV #LDNOD,XQDST+4(R5) ;LOAD NODE ADDRESS MOV MYNOD,XQSRC+4(R5) ;MY NODE ADDRESS MOV #XQSYST,XQTYP(R5) ;INSERT XQ: SYSTEM TYPE CODE MOV #MINWC,XQWC(R5) ;MINIMUM WORD COUNT MOV LWT,XQDTSK(R5) ;DESTINATION TASK NAME(1) MOV LWT+2,XQDTSK+2(R5) ;DESTINATION TASK NAME(2) MOV MYTSK,XQSTSK(R5) ;SOURCE TASK NAME(1) MOV MYTSK+2,XQSTSK+2(R5) ;SOURCE TASK NAME(2) RTS PC ; ;TYPE ERROR MESSAGE(R0=POINTER TO MESSAGE CONTROL BLOCK) ; TYPE: MOV (R0)+,TTDPB+Q.IOPL ;BUFFER ADDRESS MOV (R0),TTDPB+Q.IOPL+2 ;BYTE COUNT DIR$ #TTDPB RTS PC ; ;OCTAL CONVERSION ROUTINE ; ; R0=INPUT WORD TO BE CONVERTED ; R4=OUTPUT BUFFER POINTER ; R0,R1 ARE DISTROYED ; OCT: MOV R2,-(SP) ;SAVE R2(CHARACTER COUNTER) MOV #6,R2 ;GET CHARACTER COUNT CLR R1 ;CLEAR NEW CHARACTER REGISTER BR 10$ ;START WITH HIGH ORDER BIT 5$: CLR R1 ;CLEAR NEW CHARACTER REGISTER ROL R0 ;BIT-1 TO C-BIT ROL R1 ;C-BIT TO R1 ROL R0 ;BIT-2 TO C-BIT ROL R1 ;C-BIT TO R1 10$: ROL R0 ;BIT-3 TO C-BIT ROL R1 ;C-BIT TO R1 BIS #60,R1 ;MAKE IT ASCII MOVB R1,(R4)+ ;STORE BYTE IN OUTPUT BUFFER SOB R2,5$ ;LOOP ON WORD COUNT MOVB #40,(R4)+ ;STORE TRAILING SPACE MOV (SP)+,R2 ;RESTORE R2 RTS PC ; ;RECEIVE AST ENTRY(SET EVENT FLAG) ; RECAST: SETF$S #RECEF ;SET EVENT FLAG ASTX$S ;EXIT AST STATE ; IOSB1: .WORD 1,0 ;PRINTER IOSB(INITIALIZE AS NOT BUSY) XQMSK: .BLKW 1 ;ALL XQ: BUFFER EVENT FLAGS MASK EFMSK: .BLKW 1 ;ALL EVENT FLAGS MASK WORD LAST: .BLKW 1 ;LAST RECEIVE PACKET COUNT LINSTA: .BLKW 1 ;LAST LINE STATUS PASCTR: .BLKW 1 ;MARKTIME PASS COUNTER MYNOD: .BLKW 2 ;MY NODE ADDRESS AND RECEIVE PACKET COUNT RCNT=MYNOD+2 ;RECEIVE MESSAGE COUNT ; ;START OF MY ID MESSAGE BLOCK(NEXT 4 LINES MUST BE IN ORDER) ; MYID: .WORD -1,-1,-1,0,0,0,XQSYST,MINWC LWT: .RAD50 /LWT.../ ;DESTINATION TASK NAME .WORD 0,0 ;MY TASK NAME FOR ID MESSAGE .WORD XQID,0 ;END OF ID MESSAGE BLOCK ; EFBUF: .BLKW 4 RECBUF: .BLKW 15. XBUF: .BLKB BUFSZ MYTSK: .BLKB BUFSZ*NBUF+4 BUF=MYTSK+4 ; ; ;DPB STORAGE ; RDPB: QIO$ IO.RLB,L1,0,,,,<0,BUFSZ> XDPB: QIOW$ IO.WLB,L1,XEF,,,,<0,BUFSZ> TTDPB: QIO$ IO.WLB,L2,,,IOSB1,,<0,0,40> GDPB: QIOW$ IO.GLI,L1,,,,, GERR: QIOW$ 0,L1,,,,,<0,STACNT> MARK: MRKT$ 20,MRKTMG,2 ;EF=16.,DT=MRKTMG SECONDS RDAT: RCVD$ ,RECBUF SDAT: SDAT$ 0,0 RDAF: RDAF$ EFBUF GTIM: GTIM$ STIM: STIM$ ; ;ERROR MESSAGE CONTROL BLOCKS ; MS1X: .WORD MS1,MS1L MS2X: .WORD MS2,MS2L MS3X: .WORD MS3,MS3L MS4X: .WORD MS4,MS4L MS5X: .WORD MS5,MS5L MS6X: .WORD MS6,MS6L MS7X: .WORD MS7,MS7L ; MS1: .ASCII /LWT--PACKET FLUSHED/<15><12> LINBUF: .BLKB LINSZ*7+2*NLIN ;PACKET PRINT FORMAT BUFFER MS1L=.-MS1 MS2: .ASCII /LWT--ILLEGAL TYPE/ MS2L=.-MS2 MS3: .ASCII /LWT--INITIALIZE NODE COMPLETE, NODE READY/ MS3L=.-MS3 MS4: .ASCII /LWT--UNKNOWN ERROR/ MS4L=.-MS4 MS5: .ASCII /LWT--ILLEGAL RECEIVE DATA/ MS5L=.-MS5 MS6: .ASCII /LWT--LINE UP/ MS6L=.-MS6 MS7: .ASCII /LWT--LINE DOWN/ MS7L=.-MS7 .EVEN .END START