.TITLE VSAST1 -- VS: AST SETUP ROUTINES .IDENT /080681/ .MCALL QIOW$,DIR$,ASTX$S ; ; AST SETUP ROUTINES FOR VSDRV VERSION 2 ; ; WRITTEN 06-AUG-81 BY JOHN OSUDAR ; ; THIS MODULE CONTAINS SETUP ROUTINES THAT ENABLE AND DISABLE AST'S ; FOR VS: QUEUES. THE ACTUAL AST ENTRY POINT IS ALSO CONTAINED HERE, ; ALONG WITH THE AST EXIT CODE, SINCE FORTRAN CANNOT HANDLE AST ROUTINES ; BY ITSELF. ALL GLOBAL ROUTINES ARE FORTRAN-CALLABLE. ; ; THE ROUTINES ARE AS FOLLOWS: ; ; VSAST1(LUN,NEFN,ASTSUB) ; ; WHERE: ; LUN IS THE LOGICAL UNIT NUMBER (ASSIGNED TO VS:) ; TO BE USED TO DO THE SETUP. ; NEFN IS THE NUMBER OF A LOCAL EVENT FLAG TO BE USED ; FOR QIO'S WITHIN THIS MODULE. ; ASTSUB IS THE NAME OF THE FORTRAN AST ROUTINE TO BE ; USED TO PROCESS ALL VS: AST'S. ; ; THIS ROUTINE IS CALLED EXACTLY ONCE, TO SET UP THE FORTRAN AST ; ROUTINE NAME, AND LUN AND EFN NUMBERS. ; ; ASTSET(QNAME,ISTAT) ; ; WHERE: ; QNAME IS A TWO-WORD VARIABLE CONTAINING THE RAD50 ; REPRESENTATION OF A QUEUE NAME. ; ISTAT IS AN INTEGER VARIABLE TO RECEIVE THE STATUS ; OF THE OPERATION. STATUS IS +1 FOR SUCCESS, ; OR AN ERROR CODE FOR FAILURE ; ; THIS ROUTINE SETS AN AST FOR THE SPECIFIED QUEUE. ; ; ASTCLR(QNAME,ISTAT) ; ; WHERE: (ARGUMENTS ARE IDENTICAL TO THOSE FOR ASTSET) ; ; THIS ROUTINE CLEARS THE AST FOR THE SPECIFIED QUEUE. ; ; TYPICAL USAGE: ; ; (1) CALL THE VSAST1 ROUTINE ONCE, AT THE START OF THE PROGRAM, GIVING ; IT THE NAME OF THE FORTRAN SUBROUTINE THAT WILL PROCESS THE ; AST'S, AND THE LUN AND EFN NUMBERS REQUIRED. ; (2) WHEN YOU WANT TO SET UP AN AST FOR A QUEUE, CALL ASTSET. ; (3) WHEN YOU WANT TO CLEAR THE AST FOR A QUEUE, CALL ASTCLR. ; ; EXAMPLE: ; ; C DECLARE AST SUBROUTINE EXTERNAL ; EXTERNAL ASTSUB ; C DEFINE A QUEUE NAME THAT IS KNOWN AT COMPILE TIME ; DATA QNAME/6RAQUEUE/ ; C ASSIGN A LUN (3, IN THIS CASE) TO VS: ; CALL ASNLUN(3,'VS',0) ; C INITIALIZE THE AST SETUP: LUN 3, EFN 27, ROUTINE ASTSUB ; CALL VSAST1(3,27,ASTSUB) ; C SET UP AN AST FOR THE QUEUE "AQUEUE" ; CALL ASTSET(QNAME,ISTAT) ; C IF THE SETUP FAILED, GO TO LABEL 8000 ; IF (ISTAT.NE.1) GOTO 8000 ; . ; . ; . ; C SET UP AN AST FOR THE QUEUE WHOSE NAME IS IN "QUENAM" ; CALL ASTSET(QUENAM,ISTAT) ; C IF THE SETUP FAILED, GO TO LABEL 8000 ; IF (ISTAT.NE.1) GOTO 8000 ; . ; . ; . ; C CLEAR THE AST FOR THE QUEUE WHOSE NAME IS IN "OLDQUE" ; CALL ASTCLR(OLDQUE,ISTAT) ; C IF IT FAILED TO CLEAR, GO TO LABEL 9000 ; IF (ISTAT.NE.1) GOTO 9000 ; . ; . ; . ; C CLEAN UP ALL AST'S (NOT NECESSARY, AS SYSTEM WILL DO THIS TOO) ; C (A SIMPLE QIO-AND-WAIT, FUNCTION "3400=IO.CLN, LUN 3, EFN 27) ; CALL WTQIO("3400,3,27) ; END ; SUBROUTINE ASTSUB(QUENAM,LENGTH) ; REAL*4 QUENAM ; C THE AST SUBROUTINE RECEIVES TWO ARGUMENTS: ; C THE FIRST IS THE RAD50 QUEUE NAME FOR WHICH THE AST OCCURRED. ; C THE SECOND IS THE LENGTH OF THE MESSAGE THAT WAS RECEIVED, ; C INCLUDING THE FOUR EXTRA BYTES CONTAINING THE SENDER TASKNAME. ; C THE SUBROUTINE DOESN'T HAVE TO USE EITHER ARGUMENT. ; . ; . ; . ; RETURN ; END ; .PAGE .PSECT .CODE.,RW,I,LCL,REL,CON VSAST1:: MOV @2(R5),LUN ;COPY THE LUN MOV @4(R5),EFN ;COPY THE EFN MOV 6(R5),SUBADR ;COPY THE AST ROUTINE ADDRESS RTS PC ;RETURN ; ASTSET:: MOV 2(R5),R0 ;GET ADDRESS OF QUEUE NAME MOV (R0)+,QNAME ;GET QUEUE NAME INTO QIO DPB MOV (R0),QNAME+2 ; MOV #VSAST,IOPRM6 ;SET ACTUAL AST ADDRESS DIR$ #QIODPB ;DO THE QIO TO SET THE AST CMP #1,$DSW ;WAS DIRECTIVE OK? BNE DIRERR ;IF NOT, ERROR MOVB IOSB,R0 ;GET THE STATUS MOV R0,@4(R5) ;STORE IT RTS PC ;RETURN ; ASTCLR:: MOV 2(R5),R0 ;GET ADDRESS OF QUEUE NAME MOV (R0)+,QNAME ;GET QUEUE NAME INTO QIO DPB MOV (R0),QNAME+2 ; CLR IOPRM6 ;INDICATE WE WANT TO CLEAR IT DIR$ #QIODPB ;DO THE QIO TO CLEAR THE AST CMP #1,$DSW ;WAS DIRECTIVE OK? BNE DIRERR ;IF NOT, ERROR MOVB IOSB,R0 ;GET THE STATUS MOV R0,@4(R5) ;STORE IT RTS PC ;RETURN ; DIRERR: MOV $DSW,R0 ;GET DSW BIC #177400,R0 ;CLEAR THE HIGH BYTE BIS #177000,R0 ;SET HIGH BYTE TO 376 OCTAL MOV R0,@4(R5) ;STORE STATUS RTS PC ;RETURN ; ; THIS IS THE ACTUAL AST ROUTINE ; VSAST: MOV (SP)+,RQNAME ;GET THE QUEUE NAME MOV (SP)+,RQNAME+2 ; MOV (SP)+,LENGTH ;GET THE MESSAGE LENGTH MOV R0,-(SP) ;SAVE THE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; MOV R3,-(SP) ; MOV R4,-(SP) ; MOV R5,-(SP) ; MOV #PARMS,R5 ;SET UP THE ARGUMENT LIST JSR PC,@SUBADR ;CALL THE SUBROUTINE MOV (SP)+,R5 ;RESTORE THE REGISTERS MOV (SP)+,R4 ; MOV (SP)+,R3 ; MOV (SP)+,R2 ; MOV (SP)+,R1 ; MOV (SP)+,R0 ; ASTX$S ;EXIT FROM AST STATE ; .PSECT .DATA.,RW,D,LCL,REL,CON IO.AST = 4400 ;SET/CLEAR AST FUNCTION QIODPB: QIOW$ IO.AST,0,0,,IOSB,,<0,0,0,0,0,0> LUN = QIODPB+Q.IOLU ;LUN EFN = QIODPB+Q.IOEF ;LOCAL EVENT FLAG IOPRM6 = QIODPB+Q.IOPL+12 ;AST ROUTINE ADDRESS QNAME = QIODPB+Q.IOPL+4 ;QUEUE NAME FOR SET/CLEAR IOSB: .BLKW 2 ;I/O STATUS BLOCK SUBADR: .BLKW 1 ;FORTRAN AST ROUTINE ADDRESS PARMS: .WORD 2,RQNAME,LENGTH ;PARAMETER LIST FOR FORTRAN CALL RQNAME: .BLKW 2 ;RECEIVED QUEUE NAME LENGTH: .BLKW 1 ;RECEIVED MESSAGE LENGTH .END ;THAT'S ALL!