.TITLE CDCMPL .IDENT /V3.2/ ; ; AUTHORS: ; VICKY WHITE, MARK PYATETSKY, DAVID M. BERG ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - JUN0282 - VW - ORIGINAL VERSION ; V02 - JULY1982- MP - RT-11 ADDED ; V03 - 22JUN84 - DB - Add FORTRAN-style hooks for user routines ; in $CDAST and $CDCMP (for RSX only). ; V3.1 - 26JUL84 - DB - replace DRIVER macro call with explicit code ; - save scratchpads used by CDPACK routines ; across calls to Fortran AST routines. ; V3.2 - 28SEP84 - DB - no completion AST routine for CDRCVW when QRCV=0 ; - eliminate references to CD.CUR ; ; ++ ; ; FUNCTION: ; THIS MODULE CONTAINS THE ASYNCHRONOUS ROUTINES OR COMPLETION ; ROUTINES USED BY THE CDPACK PACKAGE OF ROUTINES ; THESE ARE ROUTINES WHICH MAY BE ENTERED ASYNCHRONOUSLY TO THE ; MAINLINE CODE OF THE ROUTINES. THEIR USE IN RSX AND RT ; OPERATING SYSTEMS IS QUITE DIFFERENT ; ; FOR RSX: ; ------- ; THE ROUTINE $CDAST IS ALWAYS ENTERED TO RECEIVE SIGNALS. IN ; ORDER TO OPEN A CONNECTION FOR A PACKET TYPE CODE AN AST ; ROUTINE MUST BE GIVEN. THIS AST ROUTINE WILL BE ENTERED ; WHENEVER A SIGNAL ARRIVES FOR THIS PTC, OR WHENEVER A MESSAGE ; IS WAITING TO BE TRANSFERRED OVER THE LINK AND NO RECEIVE ; QIO HAS ALREADY BEEN ISSUED. ; ; The routine $CDCMP is entered if an user I/O completion routine ; has been specified by calling CDUSER. In that case, $CDCMP calls ; the user routine FORTRAN-style, with the message block number ; as the only argument. In the case of arrival of an unsolicited ; message or signal, the routine $CDAST checks if a user routine ; has been specified by calling CDUSER, and if so, calls it the ; same way. The two optional user routines are independent, but ; may be the same routine if desired. GREAT CARE MUST BE EXERCISED ; IN USING THE OPTIONAL USER ROUTINES. ; ; FOR RT11: ; -------- ; WHENEVER A NO-WAIT I/O REQUEST IS MADE TO THE COMMUNICATIONS ; DRIVER, A COMPLETION ROUTINE $CDCMP IS USED. THIS IS ENTERED ; WHEN THE OPERATION COMPLETES AND THE STATUS CODE FOR THE ; OPERATION CAN BE SET UP IN THE MESSAGE BLOCK ; ; ; THIS MODULE CONTAINS THE FOLLOWING ROUTINES ; ; $CDAST ; $CDCMP ; ; ; EACH ROUTINE IS DESCRIBED MORE FULLY BELOW: ; ; MACROS: ; ------ .MCALL RT$RSX ;TO DEFINE VERSION: RT-11 OR RSX-11M .MCALL PUSH,POP ;TO SAVE/RESTORE REGISTERS ON STACK .MCALL CALL,RETURN ;TO INVOKE SUBROUTINES .MCALL $CM82 ;TO DEFINE THE COMMON CDCM82 .MCALL MBL$DF ;TO DEFINE THE MESSAGE BLOCK OFFSETS .MCALL ACT$DF ;TO DEFINE THE ACTIONS AS FUNCTIONS .MCALL ERR$DF ;TO DEFINE ERROR CODES ;HEADER AREA RT$RSX ;DEFINE VERSION: RT-11 OR RSX-11M MBL$DF ;DEFINE MESSAGE BLOCK OFFSETS ACT$DF ;DEFINE ACTIONS AS FUNCTIONS ERR$DF ;DEFINE ERROR CODES ; ; LOCAL VARIABLES: ; --------------- .IF NDF RT11 ; ARGBLK: .BYTE 1,0 ;FORTRAN-STYLE ARGUMENT BLOCK .WORD MBN ; FOR CALLING USER AST ROUTINES MBN: .BLKW 1 ;MESSAGE BLOCK NUMBER ; .ENDC ; ; COMMON AREAS: CDCM82 ; -------------------- $CM82 ;MACRO TO DEFINE COMMON ; ; GLOBALS: ; ------- .IF NDF RT11 .GLOBL $FNDUN ;FIND MESSAGE BLOCK BY CD UNIT NUMBER .GLOBL $CDAST ;ROUTINE ENTRY POINT .IFTF .GLOBL $CDCMP ;ROUTINE ENTRY POINT .ENDC .PAGE .SBTTL $CDAST AST ROUTINE TO RECEIVE SIGNAL/MESSAGE ; ; ON ENTRY TO THIS ROUTINE THE STACK IS AS FOLLOWS ; (SP) ADD THIS TO STACK BEFORE AST EXIT ; 2(SP) PACKET TYPE CODE ; 4(SP) WORD COUNT(POSITIVE) OR SIGNAL (NEGATIVE) ; - LOW BYTE = SIGNAL VALUE ; 6(SP) COMMUNICATIONS DEVICE UNIT NUMBER ; .IF NDF RT11 ; ; MACROS ; .MCALL ASTX$S,SETF$S,QIO$S .MCALL ACTION .MCALL CDI$DF ; CDI$DF ;DEFINE FUNCTION CODES AND SUB-FN BITS ; A.PTC=2 ;POSITION OF PTC ON STACK A.WC=4 ;POSITION OF WC OR SIGNAL ON STACK A.UNT=6 ;POSITION OF CD UNIT NUMBER ON STACK REGSAV=14 ;NO. OF BYTES ON STACK FOR SAVED REGISTERS ; ; $CDAST:: PUSH ;SAVE REGISTERS TST A.WC+REGSAV(SP) ;IF POSITIVE = WC OF MSG. BGE 20$ ;BRANCH IF PENDING MSG ; ; SIGNAL OR PENDING MESSAGE WITH NO RECEIVE BUFFER- ; FIND THE OPEN CONNECTION MESSAGE BLOCK FOR THIS PTC ; 10$: MOV A.UNT+REGSAV(SP),R1 ;CD DEVICE UNIT NUMBER MOV A.PTC+REGSAV(SP),R2 ;PACKET TYPE CODE MESSAGE ;DESTINED FOR MOV #S.OPEN,R3 ;SET TYPE OF MB TO MATCH ON CALL $FNDUN ;FIND THE MB TST R1 ;R1 = ADDRESS OF MB IF FOUND BNE 5$ ;BRANCH IF NOT FOUND - ERROR JMP ASTERR 5$: MOV A.WC+REGSAV(SP),MB.PWC(R1) ;SET WC IF WAS WC OF PENDING MSG BGE 6$ MOVB A.WC+REGSAV(SP),MB.SIG(R1) ;SAVE SIGNAL VALUE INC MB.SNO(R1) ;INCREMENT COUNT FOR SIGNALS ;RECEIVED BIS #S.PSIG,(R1) ;SET NEW SIGNAL RECEIVED BIT BR 7$ 6$: BIS #S.PMSG,(R1) ;SET PENDING MESSAGE BIT 7$: MOVB MB.FLG(R1),R0 ;EF TO SET FOR MAINLINE SETF$S R0 ;SET EF TST CD.SIG ;USER SIGNAL ROUTINE? BEQ 9$ ;BRANCH IF NONE MOV MB.MBN(R1),MBN ;LOCAL COPY OF MESSAGE BLOCK NUMBER MOV #ARGBLK,R5 ;FORTRAN-STYLE ARGUMENT BLOCK PUSH ;SAVE CDPACK SCRATCHPADS CALL @CD.SIG ;CALL USER ROUTINE POP ;RESTORE CDPACK SCRATCHPADS 9$: JMP ASTX ; ; RECEIVE PENDING MESSAGE IF PENDING RECEIVE BUFFER ; 20$: MOV A.UNT+REGSAV(SP),R1 ;CD DEVICE UNIT NUMBER MOV A.PTC+REGSAV(SP),R2 ;PACKET TYPE CODE MESSAGE ;DESTINED FOR MOV #S.WRCV,R3 ;FIND MB WITH PENDING RECEIVE ;FOR THIS PTC AND DEVICE UNIT CALL $FNDUN TST R1 ;R1 = ADDRESS OF MB IF FOUND BEQ 10$ ;BRANCH IF NOT FOUND ; ; ISSUE THE RECEIVE REQUEST INTO THE WAITING BUFFER ; PUSH ;SAVE CURRENT FUNCTION ;IN CASE IN MIDDLE OF ANOTHER ACTION ACTION RCV ;DO A RECEIVE I/O REQUEST MOV MB.BUF(R1),R3 ;RECEIVE BUFFER ADDRESS MOV MB.PWC(R1),R4 ;SET MAX WC FOR BUFFER IN R4 BISB CD.MOD,CD.FNC ;SET ANY SUBFUNCTION BITS ASL R4 ;CONVERT TO BYTE COUNT MOV R1,R5 ;MESSAGE BLOCK ADDRESS ADD #MB.ST1,R5 ;I/O STATUS BLOCK ADDRESS MOVB MB.FLG(R1),R0 ;EF TO BE SET BIT #S.WAIT,MB.CUR(R1) ;WAIT FOR COMPLETION? BNE 72$ QIO$S CD.FNC,MB.CHN(R1),R0,,R5,CD.CRN, BR 75$ 72$: QIO$S CD.FNC,MB.CHN(R1),R0,,R5,, ;WAIT IS IN MAIN ROUTINE FOR EF 75$: BIC #S.WRCV,MB.CUR(R1) ;NO LONGER WAITING FOR RECEIVE POP ;RESTORE CURRENT FUNCTION ASTX: POP ;RESTORE REGISTERS ADD (SP),SP ;CLEAN AST PARAMETERS OFF STACK ASTX$S ;EXIT FROM AST ; ; ERROR - NO OPEN CONNECTION MB FOUND - SHOULD NEVER HAPPEN ; ASTERR: IOT ;DRASTIC!! CRASH ; .ENDC .PAGE .SBTTL $CDCMP AST ROUTINE FOR I/O COMPLETION ; ; ON ENTRY TO THIS ROUTINE THE STACK CONTAINS THE ADDRESS OF THE ; I/O STATUS BLOCK ; .IF NDF RT11 ; $CDCMP:: PUSH ;SAVE REGISTERS TST CD.CMP ;USER COMPLETION ROUTINE? BEQ 9$ ;BRANCH IF NONE MOV REGSAV(SP),R1 ;R1 = ADDR OF IOSB BEQ CMPERR ;BRANCH IF NO IOSB - ERROR SUB #MB.ST1,R1 ;R1 = ADDR OF MESSAGE BLOCK MOV MB.MBN(R1),MBN ;LOCAL COPY OF MESSGE BLOCK NUMBER MOV #ARGBLK,R5 ;FORTRAN-STYLE ARGUMENT BLOCK PUSH ;SAVE CDPACK SCRATCHPADS CALL @CD.CMP ;CALL USER ROUTINE POP ;RESTORE CDPACK SCRATCHPADS 9$: POP ;RESTORE REGISTERS TST (SP)+ ;CLEAN OFF STACK ASTX$S ;EXIT FROM AST ; ; ERROR - NO STATUS BLOCK ON I/O COMPLETION - SHOULD NEVER HAPPEN ; CMPERR: IOT ;DRASTIC!! CRASH ; .ENDC ; ; .SBTTL $CDCMP COMPLETION ROUTINE FOR RT11 ; .IF DF RT11 ; $CDCMP:: PUSH ;SAVE REGISTERS TST CD.CRN ;USERS OWN COMPLETION ROUTINE BEQ ASTX ;BRANCH IF NONE CALL @CD.CRN ;CALL USERS ROUTINE ASTX: POP ;RESTORE REGISTERS RETURN ; .ENDC ; .END