;XQDRV DATAGRAM INTERFACE (XQDGRM.MAC) ; ;FORTRAN CALLABLE XQ: INTERFACE ROUTINES ; ; PAUL ELKINS 1-OCT-84 ; ; 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. ; ; .MCALL XQPRCL ; XQPRCL ;DEFINE XQ: PROTOCOL ; ; ; CALLING SEQUENCE ; ; CALL XQINIT(LUN,[TSKNAM],[NODADR],[IDS]) ; ; LUN=XQDRV LUN FOR QIO CALLS ; TSKNAM=YOUR RETURNED TASK NAME ; NODADR=YOUR RETURNED NODE ADDRESS ; IDS=XQDRV STATUS - ONLINE/OFFLINE ; ; CALL XQREC(BUF,WC,EF,IOSB,IDS) ; ; CALL XQSND(BUF,WC,EF,IOSB,IDS) ; ; CALL XQREQ(BUF,WC,EF,IOSB,IDS) ; FILLS IN SOURCE FIELDS AND WC ; SENDS PACKET ; ; CALL XQACK(BUF,WC,EF,IOSB,IDS) ; SWAPS TO/FROM FIELDS ; FILLS IN SOURCE FIELDS AND WC ; SENDS PACKET ; ; CALL XQSWAP(BUF) ; SWAPS TO/FROM FIELDS ; FILLS IN SOURCE FIELDS AND WC ; ; CALL XQFILL(BUF) ; FILLS IN SOURCE FIELDS AND WC ; ; BUF=BUFFER ADDRESS ; WC=BUFFER LENGTH IN WORDS ; EF=EVENT FLAG ; IOSB=I/O STATUS BUFFER ADDRESS ; IDS=DIRECTIVE STATUS WORD ; .TITLE XQDGRM .MCALL DIR$,QIO$,QIOW$ .MCALL GTSK$S,ASTX$S ; XX1=2 ;OFFSET TO FIRST ARGUMENT XX2=4 ;OFFSET TO SECOND ARGUMENT XX3=6 ;OFFSET TO THIRD ARGUMENT XX4=10 ;OFFSET TO FOURTH ARGUMENT XX5=12 ;OFFSET TO FIFTH ARGUMENT ; XQINIT::MOV @XX1(R5),RDPB+Q.IOLU ;READ LUN MOV @XX1(R5),WDPB+Q.IOLU ;WRITE LUN MOV @XX1(R5),GDPB+Q.IOLU ;GET LINK INFO LUN GTSK$S #BUF ;GET TASK PARAMETERS DIR$ #GDPB ;GET NODE ADDRESS MOV (R5),R0 ;GET ARG COUNT DEC R0 ;ANY ARGS. LEFT BLE 15$ ;NO EXIT BIT #1,XX2(R5) ;TASK NAME REQUESTED BNE 5$ ;NO MOV XX2(R5),R1 ;GET TASK NAME ADDRESS MOV TASK,(R1)+ ;STORE FIRST PART MOV TASK+2,(R1) ;STORE SECOND PART 5$: DEC R0 ;ANY ARGS. LEFT BLE 15$ ;NO EXIT BIT #1,XX3(R5) ;NODE ADR REQUESTED BNE 10$ ;NO MOV NODADR,@XX3(R5) ;STORE NODE ADDRESS 10$: DEC R0 ;ANY ARGS. LEFT BLE 15$ ;NO EXIT BIT #1,XX4(R5) ;IDS REQUESTED BNE 15$ ;NO MOV $DSW,@XX4(R5) ;RETURN DSW FROM GET STATUS QIO TSTB IOSB ;DID I/O SUCCEED ? BPL 15$ ;YES MOV IOSB,@XX4(R5) ;ERROR RETURN IOSB AS IDS 15$: RTS PC ; ; SEND A MESSAGE ; XQSND:: MOV @XX2(R5),R0 ;GET WORD COUNT ASL R0 ;MAKE IT BYTE COUNT CMP R0,#DGMAX ;LT MAXIMUM SIZE BGT 3$ ;NO ERROR CMP R0,#DGMIN ;GE MINIMUM MESSAGE SIZE BGE 5$ ;YES CONTINUE 3$: MOV #IE.SPC,@XX5(R5) ;RETURN ERROR CODE BR 10$ ;EXIT 5$: MOV R0,WDPB+Q.IOPL+2 ;INSERT BYTE COUNT MOV XX1(R5),WDPB+Q.IOPL ;INSERT BUFFER ADDRESS MOVB @XX3(R5),WDPB+Q.IOEF ;GET EVENT FLAG MOV XX4(R5),WDPB+Q.IOSB ;GET I/O STATUS ADDRESS DIR$ #WDPB ;SEND PACKET/WAIT MOV $DSW,@XX5(R5) ;RETURN IDS 10$: RTS PC ; ; POST A RECEIVE ; XQREC:: CMP @XX2(R5),#MINPKT/2 ;CHECK FOR MIN. BUFFER SIZE BGE 5$ MOV #IE.SPC,@XX5(R5) ;RECEIVE BUFFER TOO SMALL BR 10$ ;EXIT 5$: MOV XX1(R5),RDPB+Q.IOPL ;RECEIVE BUFFER ADDRESS MOV @XX2(R5),RDPB+Q.IOPL+2 ;BUFFER LENGTH ASL RDPB+Q.IOPL+2 ;CONVERT TO BYTES MOVB @XX3(R5),RDPB+Q.IOEF ;GET EVENT FLAG MOV XX4(R5),RDPB+Q.IOSB ;I/O STATUS ADDRESS DIR$ #RDPB ;POST RECEIVE MOV $DSW,@XX5(R5) ;RETURN IDS 10$: RTS PC ; ;SEND REQUEST(FILL IN SOURCE FIELDS AND WC) ; XQREQ:: JSR PC,XQFILL ;FILL IN SOURCE FIELDS AND WC BR XQA1 ; ;SEND ACKNOWLEDGE(SWAP TO/FROM FIELDS FILL SOURCE AND WC) ; XQACK:: JSR PC,XQSWAP ;SWAP TO/FROM FILL IN SOURCE FIELDS XQA1: MOV XX1(R5),R0 ;GET BUFFER ADDRESS MOV @XX2(R5),XQWC(R0) ;FILL IN WORD COUNT JSR PC,XQSND ;SEND PACKET RTS PC ; ;SWAP TO/FROM FIELDS FILL IN SOURCE FIELDS ; XQSWAP:: MOV XX1(R5),R0 ;GET BUFFER ADDRESS CLR (R0) ;CLEAR MULTICAST/BROADCAST BITS CLR 2(R0) ;CLEAR BROADCAST BITS MOV XQSRC+4(R0),XQDST+4(R0) ;SOURCE TO DESTINATION MOV XQSTSK(R0),XQDTSK(R0) ;NEW DESTINATION NAME(1) MOV XQSTSK+2(R0),XQDTSK+2(R0) ;NEW DESTINATION NAME(2) XQFILL:: MOV XX1(R5),R0 ;GET BUFFER ADDRESS MOV NODADR,XQSRC+4(R0) ;INSERT NODE ADDRESS MOV TASK,XQSTSK(R0) ;INSERT SOURCE TASK NAME(1) MOV TASK+2,XQSTSK+2(R0) ;INSERT SOURCE TASK NAME(2) RTS PC RDPB: QIO$ IO.RLB WDPB: QIO$ IO.WLB GDPB: QIOW$ IO.GLI,,16.,,IOSB,, BUF: .BLKW 16. TASK=BUF IOSB=BUF+4 NODADR=BUF+10 .END