.title READHD READ THE MAQUEUE HEADER .IDENT /1.2/ ;.begin.doc ************************** begin.doc ; ; .c ;MODULE ; .c ;^&READHD\& ; .nf ; .x READHD>Defined ; Source:READHD.MAC ; TO BECOME PART OF LIBRARY:QUEUE.OLB ; Designer :EARL LAKIA ; Author :DAVE LUECK ; 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 ; ; MSGREC BYTE(ISIZE) ; BUFFER TO BE RECEIVE QUEUE HEADER ; NOTE: DIMENSIONED TO SIZE ISIZE ; ; ISIZE INTEGER*2 ; SIZE OF BUFFER TO RECEIVE HEADER ; ; ; Returns: ; ; RECSIZ INTEGER*2 ; NUMBER OF BYTES READ ; ; READHD 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 the header of the ; Manufacturing Automation Queue. The return status is ; returned as the value of the function subroutine. The ; calling sequence is: ; .sk ; .tp 40 ; .nofill ; INCLUDE 'QHDDEF.TXT' ; 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 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 ; C ASSIGN A LUN TO THE PSEUDO DEVICE FOR THE QUEUE ; C ; CALL ASSIGN(LUN,'ZQ0:') ; C ; C READ THE QUEUE HEADER ; C ; STATUS=READHD(LUN,IEFN,QHDDEF,QXKSIZ,RECSIZ) ; C ; IF(STATUS .NE. QUESUC)THEN ; TYPE *,' BAD QUEUE STATUS ON HEADER READ' ; TYPE *,' DIRECTIVE STATUS: ',STATB(1) ; TYPE *,' I/O STATUS: ',STATB(2) ; CALL EXIT ; ELSE ; TYPE *,' SIZE OF QUEUE HEADER: ',RECSIZ ; 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.DAO (-13) -- User buffer to small to contain the queue header. ; .els ; end.doc ****************************** end.doc .PAGE .MCALL DIR$ .MCALL QIOW$ ; ; 0(R5)= NUMBER OF ARGUMENTS ; 2(R5)= LUN ; 4(R5)= EFN ; 6(R5)= ADDRESS OF MESSAGE ID LIST HEAD BUFFER ; 10(R5)= ADDRESS OF BUFFER SIZE ; 12(R5)= ADDRESS OF RETURN BUFFER SIZE ; ; STATUS=READHD(LUN,IEFN,BUFFER,BUFSIZ,RECSIZ) ; .PSECT Q$CODE,RO,I,CON READHD:: CMP #5,(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 ; 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 IOSB+2,@(R5)+ ; RETURN BYTE COUNT OF TRANSFER 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= Address of message id buffer (16 bytes long) ; .le;P2= Byte count of message id (16 bytes) ; DOIO: QIOW$ IO.ACE,,,,IOSB,, ; IOSB: .WORD 0,0 .END