.title READQ READ MESSAGE FROM QUEUE .IDENT /1.2/ ;.begin.doc ************************** begin.doc ; ; .c ;MODULE ; .c ;^&READQ\& ; .nf ; .x READQ>Defined ; Source:READQ.MAC ; TO BECOME PART OF LIBRARY:QUEUE.OLB ; Designer :EARL LAKIA ; Author :EARL LAKIA ; Inland Steel ; Process Automation Department ; 3210 Watling St. MS 2-465 ; East Chicago, IN 46312 ; ; Date of last update:18-MAY-1987 ; Revision level :1.2 ; ; .C ;Formal Parameter List ; Receives: ; ; LUN INTEGER*2 ; LOGICAL UNIT NUMBER ASSIGNED TO ZQ0: ; ; EFN INTEGER*2 ; EVENT FLAG TO BE USED FOR I/O SYNC ; ; MSGID CHARACTER*16 (BYTE(16)) ; MESSAGE ID OF MESSAGE TO READ ; ; MSGREC BYTE(ISIZE) ; BUFFER TO BE RECEIVE MESSAGE FROM QUEUE ; NOTE: DIMENSIONED TO SIZE ISIZE ; ; ISIZE INTEGER*2 ; SIZE OF BUFFER TO RECIEVE MESSAGE ; ; ; Returns: ; ; RECSIZ INTEGER*2 ; ACTUAL RECORD SIZE READ ; (TOTAL SIZE INCLUDING THE HEADER SIZE) ; ; RNA INTEGER*2 ; WORD TO RECEIVE READ NOT ACKNOWLEGED ; POINTER ; (RETURNED FROM ACP/DRIVER IN I/O STATUS ; BLOCK) ; ; READQ INTEGER*2 ; FUNCTION VALUE RETURN STATUS OF THE READ ; ; Accesses common(s): ; ; Accesses file(s): ; ; Other modules referenced: ; .SK ; .fill ; .SK ; Description: ; .sk ; This subroutine allows the caller to read a message from ; the Manufactoring Automation Queue. The return status is ; returned as the value of the function subroutine. The ; RNA pointer must be used to acknowlege the read from the queue ; and actually remove it from the queue. The ; calling sequence is: ; .sk ; .tp 40 ; .nofill ; INCLUDE 'HDRDEF.TXT' ; PARAMETER (BUFSIZ=512) ; BYTE BUFFER(BUFSIZ) ! INPUT BUFFER ; EQUIVALENCE (BUFFER,HDRDEF) ! EQUIVALENCE FOR SYMBOLIC ; ! OFFSETS ; INTEGER*2 STATUS ! RETURN STATUS ; BYTE STATB(2) ; EQUIVALENCE(STATUS,STATB) ! BYTE ADDRESSABLE STATUS ; CHARACTER*16 MSGID ! MESSAGE ID ; INTEGER*2 LUN ! LUN ASSIGNED TO ZQ0: ; INTEGER*2 IEFN ! EVENT FLAG ; INTEGER*2 RNA ! READ BUT NOT ACKNOWLEGED POINTER ; INTEGER*2 RECSIZ ! RETURNED ACTUAL RECORD SIZE ; INTEGER*2 QUESUC ! SUCESSFUL QUE STATUS ; C ; DATA QUESUC/"401/ ; DATA LUN/1/ ! LOGICAL UNIT NUMBER ; DATA IEFN/1/ ! EVENT FLAG FOR I/O SYNC ; C ; MSGID='DUMMY ID' ! OUR MESSAGE ID ; C ; C ASSIGN A LUN TO THE PSEUDO DEVICE FOR THE QUEUE ; C ; CALL ASSIGN(LUN,'ZQ0:') ; C ; C READ THE MESSAGE FROM QUEUE ; C ; STATUS=READQ(LUN,IEFN,MSGID,BUFFER,BUFSIZ,RECSIZ,RNA) ; C ; IF(STATUS .NE. QUESUC)THEN ; TYPE *,' BAD QUEUE STATUS ON READ" ; TYPE *,' DIRECTIVE STATUS: ',STATB(1) ; TYPE *,' I/O STATUS: ',STATB(2) ; CALL EXIT ; ELSE ; TYPE *,' RNA POINTER: ',RNA ; TYPE *,' SIZE OF DATA PORTION: ',HxLEN ; WRITE(*,100)(BUFFER(I),I=1,RECSIZ) ; 100 FORMAT(' BUFFER: ',20(/,1X,40(Z2.2))) ; ENDIF ; .FILL ; .SK ; Possible error codes: ; .LIST 1,' ' ; .le;Bad directive status (possibly device not mounted, etc.) ; (upper byte will be zero) ; .le;Bad I/O status (R0 lower byte= 1, upper byte= I/O status) ; .LE;IE.UKN (-97) -- Message id does not exist. ; .le;IE.DAO (-13) -- User buffer to small to contain message read. ; .le;IE.FOP (-53) -- A message exists in the queue that has been read ; but not acknowledged. ; .le;IE.NLK (-79) -- Task is not connected to queue; cannot read any ; messages until connected. ; .le;IE.NST (-80) -- Another task is connected to queue; cannot read ; any messages while other task connected. ; .le;IE.EOF (-10) -- No messages in queue. ; .els ; end.doc ****************************** end.doc .PAGE .MCALL DIR$ .MCALL QIOW$ .MCALL HDRDEF HDRDEF ; ; 0(R5)= NUMBER OF ARGUMENTS ; 2(R5)= LUN ; 4(R5)= EFN ; 6(R5)= ADDRESS OF MESSAGE ID NAME ; 10(R5)= ADDRESS OF MESSAGE BUFFER ; 12(R5)= ADDRESS OF BUFFER SIZE ; 14(R5)= ADDRESS OF RETURN BUFFER SIZE ; 16(R5)= ADDRESS OF RNA ; ; STATUS=READQ(LUN,IEFN,MSGID,BUFFER,BUFSIZ,RECSIZ,RNA) ; ; .PSECT Q$CODE,RO,I,CON READQ:: CMP #7,(R5)+ ; CORRECT NUMBER OF ARGUMENTS BEQ 10$ ; YES TRAP <128.+80.> ; FORTRAN OTS TRAP FOR ILLEGAL NUMBER ; OF ARGUMENTS RETURN 10$: MOVB @(R5)+,DOIO+Q.IOLU ; GET LOGICAL UNIT NUMBER MOV @(R5)+,DOIO+Q.IOEF ; EVENT FLAG MOV (R5)+,DOIO+Q.IOPL+4 ; GET MESSAGE ID NAME ADDRESS ; 20$: ; MOV (R5)+,DOIO+Q.IOPL ; GET BUFFER ADDRESS MOV @(R5)+,DOIO+Q.IOPL+2 ; BYTE COUNT OF THE BUFFER ; ; NOW DO THE QIO ; DIR$ #DOIO ; DO THE I/O BCC 30$ ; DIRECTIVE ACCEPTED MOVB $DSW,R0 ; SIGN EXTEND BAD DIRECTIVE STATUS BIC #177400,R0 ; CLEAR I/O STATUS RETURN ; ; DIRECTIVE RECEIVED, RETURN THE I/O STATUS ; 30$: MOV DOIO+Q.IOPL,R1 ; GET BUFFER ADDRESS MOV H.LEN(R1),R1 ; GET SIZE OF THE DATA PART OF THE MESSAGE ADD #H.SIZ,R1 ; ADD SIZE OF THE HEADER MOV R1,@(R5)+ ; RETURN TO THE CALLER MOV IOSB+2,@(R5)+ ; RETURN THE RNA POINTER MOVB IOSB,R0 ; I/O STATUS SWAB R0 ; MOVE I/O STATUS TO UPPER BYTE CLRB R0 ; CLEAR LOW BYTE BISB $DSW,R0 ; MERGE IN THE DIRECTIVE STATUS INLOWER BYTE RETURN .PAGE .PSECT Q$DATA,RW,CON,D ; ; .le;P1= Message buffer address ; .le;P2= Byte count of user message ; .le;P3= Address of message id buffer (16 bytes long) ; .le;P4= Destroyed when id buffer relocated ; .le;P5= Type of message (0= deletable if queue is full, 1= not) ; DOIO: QIOW$ IO.RVB,,,,IOSB,, ; IOSB: .WORD 0,0 .END