.TITLE TIQIO - WVB QIO TO TI: WITH TIMEOUT .IDENT /010385/ .ENABL GBL .ENABL LC .NLIST BEX ; ;+ ;***** ; ; TIQIO.MAC - Issues write-virtual-block QIO to TI: with ; a timeout. Assumes the global symbols "TI$LUN" and "TI$EFN" ; define the logical unit number and event flags to be used ; in issuing the QIO, AND that TI$LUN has already been ; assigned to TI:. Once the QIO is issued, the caller ; will resume processing but be blocked from re-issuing ; subsequent QIOs until "TI$EFN" event flag is set. ; The event flag is set by either I/O completion or I/O ; being aborted by a timeout. Both the QIO and the mark-time ; requests have an AST service routine which handles ; cancelling the mark-time (in the case of QIO completion), ; or cancelling the QIO (in the case of mark-time completion). ; ; Because this is an AST driven routine, the caller may ; start exitting before the QIO or MARK-TIME requests have ; been completed. To synchronize task exit with activity ; started by this routine, call $TIQIO with a null message. ; This causes the wait-for to synch to QIO or MARK-TIME completion ; but will not issue another request. ; ; CALL SEQUENCE: ; CALL $TIQIO ; WITH: ; R0 = Start address of message to write ; R1 = Length of message ; contents of R0,R1 destroyed on return ; ; ; NOTE: Message must explicitly include any vertical formatting ; desired. Logical unit number = TI$LUN must have already ; been assigned to the appropriate physical device for this ; routine to function correctly. ; ;***** ; ; Paul Sorenson ; AEP/Operations Control Systems ; Columbus, OH 43214 ; ;***** ; ; Update 1/30/85 -- PRS; re-work of "$CIQIO" routine formerly included ; in GCCI.MAC to be AST driven ; ;***** ;- ; .MCALL DIR$,QIO$,MRKT$,SETF$S,CMKT$S,WTSE$S,ASTX$S ; ; *** LOCAL VARIABLES/DPB'S ; .PSECT $IDATA,RW,D,LCL,CON,REL QIODPB: ; GENERAL QIO DPB FOR PROMPTS QIO$ ,TI$LUN,TI$EFN,,,QIOAST,<,,0> MRKTIM: MRKT$ ,,2.,MRKAST ; WAIT FOR N SECONDS ; ; *** ; .PSECT $PCODE,RO,I,LCL,CON,REL $TIQIO:: ; GLOBAL ENTRY POINT FOR ANYONE TST QIODPB+Q.IOFN ; CHECK IF FUNCTION DEFINED BNE 5$ ; BRANCH IF YES, NTH CALL SETF$S #TI$EFN ; FIRST TIME, INIT EF STATE BR 6$ ; AND ISSUE QIO 5$: WTSE$S #TI$EFN ; ELSE, WAIT FOR EVENT FLAG 6$: MOV R1,QIODPB+Q.IOPL+2 ; SAVE LENGTH OF MESSAGE BEQ 19$ ; BRANCH IF NOTHING THERE MOV R0,QIODPB+Q.IOPL ; SAVE MESSAGE START ADDRESS MOV #IO.WVB,QIODPB+Q.IOFN ; SETUP FUNCTION CODE MOV #TI$EFN,QIODPB+Q.IOEF ; SETUP EVENT FLAG # MOV #QIOAST,QIODPB+Q.IOAE ; SETUP AST ROUTINE DIR$ #QIODPB ; ISSUE QIO MOV #2,R0 ; SETUP 2 SEC BASE TIMEOUT ASR R1 ; DIVIDE MSG LENGTH BY 8 ASR R1 ASR R1 ADD R1,R0 ; COMPUTE TIMEOUT TO USE MOV R0,MRKTIM+M.KTMG ; AND SAVE IT DIR$ #MRKTIM ; ISSUE MARK TIME 19$: RETURN ; RETURN TO CALLER ; ; *** QIOAST - FIELD QIO COMPLETION, CANCEL MARK TIME ; QIOAST: TST (SP)+ ; ALIGN STACK CMKT$S ,#MRKAST, ; CANCEL MARK TIME ASTX$S ; AND EXIT AST ; ; *** MRKAST - FIELD TIMEOUT, KILL QIO ON LUN ; MRKAST: TST (SP)+ ; ALIGN STACK MOV #IO.KIL,QIODPB+Q.IOFN ; REDEFINE FUNCTION CLR QIODPB+Q.IOEF ; NO EVENT FLAG CLR QIODPB+Q.IOAE ; NOR AST DIR$ #QIODPB ; ISSUE KILL ASTX$S ; AND EXIT AST ; .END ;$TIQIO