.TITLE CDMODE .IDENT /V2.1/ ; ; AUTHOR: ; VICKY WHITE ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - JUN2282 - VW - ORIGINAL VERSION ; V02 - 22JUN84 - DB - NEW VERSION OF CDUSER FOR RSX SPECIFIES ; TWO FORTRAN-CALLABLE USER AST ROUTINES ; - ADD CDERRL SUBROUTINE (for RSX only) ; V2.1 - 28SEP84 - DB - modify interpretation of null arguments ; to CDUSER; they now cancel user AST ; ; ++ ; ; FUNCTION: ; PACKAGE OF ROUTINES WHICH SET UP PARAMETERS USED BY THE OTHER ; CDPACK ROUTINES, WHICH ACTUALLY PERFORM THE I/O REQUESTS TO THE ; CD DRIVER. ; THESE ROUTINES SET PARAMETER VALUES IN VARIOUS VARIABLES IN THE ; HEADER AREA OF THE COMMON CDCM82 ; ------- ; ; CALLING SEQUENCES: ; ---------------- ; ; CALL CDMODE(QRCV,QDOWN,SLEEP,RCVTMO) - SET MODE FOR TRANSFER I/O ; CALL CDCHAN(CHAN) - SET CHANNEL NUMBER ; CALL CDRCVP(RPTC) - SET RECEIVER PTC ; CALL CDXMTP(XPTC) - SET TRANSMIT PTC ; CALL CDRBUF(RBUF,MAXWC) - SET RECEIVE BUFFER AND LENGTH ; CALL CDXBUF(XBUF) - SET TRANSMIT BUFFER ; CALL CDTMO(TIMVAL,TIMUNT) - SET TIMEOUT VALUE FOR WAIT I/O ; CALL CDERRL(ERLUN) **RSX** - SET ERROR MESSAGE LUN ; CALL CDUSER(RTNADD) **RT** - USER ROUTINE TO BE CALLED ; FROM COMPLETION ROUTINE ; CALL CDUSER(USRCMP,USRSIG) **RSX** - USER ROUTINES CALLED FROM ; I/O COMPLETION AST AND ; SIGNAL/UNSOLICITED RECEIVE AST ; ; MACROS: ; ------ .MCALL RT$RSX .MCALL $CM82,ERR$DF,ACT$DF RT$RSX ;DEFINE VERSION: RT-11 OR RSX-11M ERR$DF ;DEFINE ERROR RETURNS ACT$DF ;DEFINE MODE BIT SETTINGS ; ; GLOBALS: ; ------- .GLOBL CDMODE ;ROUTINE ENTRY POINTS .... .GLOBL CDCHAN .GLOBL CDRCVP .GLOBL CDXMTP .GLOBL CDRBUF .GLOBL CDXBUF .GLOBL CDTMO .IF NDF RT11 .GLOBL CDERRL .IFTF .GLOBL CDUSER .IFT .GLOBL $CDCMP ;I/O COMPLETION AST .ENDC .PAGE ; ; INPUTS TO ROUTINES ; ----------------- ; R5 IS THE ADDRESS OF A FORTRAN ARGUMENT LIST ; ; OUTPUTS ; ------- ; NONE ; ; ; ; COMMON AREA CDCM82 ; ------------------ $CM82 ;DEFINE PSECT CDCM82 ; .PAGE ; ; SUBROUTINE CDMODE(QRCV,QDOWN,SLEEP,RCVTMO) ; ------------------------------------------ ; CDMODE:: PUSH R5 CLR CD.MOD ;RESET MODE TST (R5)+ TST @(R5)+ ;1ST ARGUMENT = QRCV BEQ 1$ ;IF = 0 FALSE BIS #QRCV,CD.MOD ;IF NON ZERO TRUE - SET QRCV MODE 1$: TST @(R5)+ ;2ND ARGUMENT = QDOWN BEQ 2$ ;IF = 0 FALSE BIS #QDOWN,CD.MOD ;IF NON ZERO TRUE - SET Q IF DOWN 2$: TST @(R5)+ ;3RD ARGUMENT = SLEEP BEQ 3$ ;IF = 0 FALSE BIS #SLEEP,CD.MOD ;IF NON ZERO - SET SLEEP ON NEXT I/O 3$: TST @(R5)+ ;4TH ARGUMENT = RCVTMO BEQ 4$ ;IF = 0 FALSE BIS #RCVTMO,CD.MOD ;IF NON ZERO - MODE = TIMEOUT ON ALL RECEIVE 4$: POP R5 RETURN ; ;----------------------------------------------------------------------- ; ; SUBROUTINE CDCHAN(CHAN) ; ----------------------- ; CDCHAN:: MOV @2(R5),CD.LUN ;SET CHANNEL NUMBER RETURN ; ;----------------------------------------------------------------------- ; ; SUBROUTINE CDRCVP(RPTC) ; ----------------------- ; CDRCVP:: MOVB @2(R5),CD.RPT ;SET RECEIVE PTC RETURN ; ;----------------------------------------------------------------------- ; ; SUBROUTINE CDXMTP(XPTC) ; ----------------------- ; CDXMTP:: MOVB @2(R5),CD.XPT ;SET TRANSMIT PTC RETURN ; ;----------------------------------------------------------------------- ; ; SUBROUTINE CDRBUF(RBUF,MAXWC) ; ----------------------------- ; CDRBUF:: MOV 2(R5),CD.RBF ;SET RECEIVE BUFFER ADDRESS MOV @4(R5),CD.RWC ;SET MAX WC FOR RECEIVE BUFFER RETURN ; ;----------------------------------------------------------------------- ; ; SUBROUTINE CDXBUF(XBUF) ; ----------------------- ; CDXBUF:: MOV 2(R5),CD.XBF ;SET TRANSMIT BUFFER ADDRESS RETURN ; ;----------------------------------------------------------------------- ; ; SUBROUTINE CDTMO(TIMVAL,TIMUNT) ; ------------------------------- ; CDTMO:: MOV @2(R5),CD.TMO ;SET TIMOUT COUNTER MOV @4(R5),CD.TMU ;SET TIMOUT UNIT RETURN ; ;---------------------------------------------------------------------- ; ; SUBROUTINE CDERRL(ERLUN) **RSX** ; ----------------------------------- ; .IF NDF RT11 ; CDERRL:: MOV @2(R5),CD.ERL ;SET ERROR MESSAGE LUN RETURN .ENDC ; ;---------------------------------------------------------------------- ; ; SUBROUTINE CDUSER(RTNADD) **RT** ; SUBROUTINE CDUSER(USRCMP,USRSIG) **RSX** ; ----------------------------------------- ; CDUSER:: ; .IF NDF RT11 ; CMPB #1,@R5 ;LOOK FOR 1ST ARGUMENT BHI 10$ ;BRANCH IF NONE CMP #-1,2(R5) ;CHECK FOR NULL ARGUMENT BNE 3$ ;BRANCH IF USER ROUTINE CLR CD.CMP ;CANCEL USER ROUTINE CLR CD.CRN ;CANCEL I/O COMPLETION AST BR 5$ 3$: MOV 2(R5),CD.CMP ;SET UP USER ROUTINE MOV #$CDCMP,CD.CRN ;SET UP I/O COMPLETION AST 5$: CMPB #2,@R5 ;LOOK FOR 2ND ARGUMENT BHI 10$ ;BRANCH IF NONE CMP #-1,4(R5) ;CHECK FOR NULL ARGUMENT BNE 7$ ;BRANCH IF USER ROUTINE CLR CD.SIG ;CANCEL USER SIGNAL ROUTINE BR 10$ 7$: MOV 4(R5),CD.SIG ;SET UP USER SIGNAL ROUTINE ; .IFF ; CMP #-1,2(R5) ;CHECK FOR NULL ARGUMENT BNE 3$ ;BRANCH IF USER ROUTINE CLR CD.CRN ;CANCEL USER ROUTINE BR 10$ 3$: MOV 2(R5),CD.CRN ;SET USER COMPLETION ROUTINE/ .ENDC ; 10$: RETURN ; .END