.NLIST .TITLE CDDRV .IDENT /V4.3/ ; ; AUTHORS: ; VICKY WHITE, MARK PYATETSKY ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - MAY1882 - VW - ORIGINAL VERSION (CDRSX) ; V02 - JULY1982- MP - RT11 ADDED ; V03 - OCT1282 - MP,VW - BR CHANGED TO JMP IN DRIVER MACRO ; ERRSET MACRO IGNORES BYTE 52 IF IT IS 1 ; AND PUTS VALUE ER.ARG INTO MESSAGE BLOCK STATUS ; V3.1 - 09NOV82 - VW - CLEAR S.WRCV BEFORE DOING QIO IN CASE OF AST ; SET MB.ST1 TO ER.PND FOR RSX AS WELL AS RT ; MUST CHECK FOR S.WAIT BIT SET BEFORE WAITING ON EF ; V04 - FEB2883 - MP - change to RT-11 CDDRV macro. ; V4.1 - 22JUN84 - DB - revise RESETM to expect flag mask in R0 ; V4.2 - 26JUL84 - DB - clear S.PMSG bit in open MB before RCV when QRCV=1 ; - DRIVER macro no longer called from AST ; - add tests in CANTMO so directive not always invoked ; - add FSTOP and MSTOP macros, and IO.KIL function code ; V4.3 - 28SEP84 - DB - no completion AST routine for wait QIO ; ; ++ ; ; FUNCTION: ; SET OF MACROS USED BY THE CDPACK ROUTINES AND THEIR RELATED ; UTILITY ROUTINES - UNDER RSX OR RT-11 OPERATING SYSTEM ;-------------------------------------------------------------------- ; ; ACT$DF - DEFINE THE ACTIONS TO PERFORM AS I/O FUNCTION CODES ; .MACRO ACT$DF CDI$DF .IF NDF RT11 OPEN=IO.SPA CLOSE=IO.RPA SIGNAL=IO.SIG RCV=IO.RLB XMT=IO.WLB .IFF OPEN=SFOPNR CLOSE=SFCLSR SIGNAL=0 RCV=1000 XMT=2000 .IFT ; ; MODE OF TRANSMIT BITS FOR I/O FUNCTION ; QRCV=SF.RDQ SLEEP=SF.SLP QDOWN=SF.RSW RCVTMO=10 .IFF QRCV=0 SLEEP=0 QDOWN=0 RCVTMO=0 .ENDC .ENDM ;-------------------------------------------------------------------- ; ; CDI$DF - DEFINE THE IO FUNCTION CODES, SUBFUNCTION BITS AND ; THE I/O STATUS ERROR RETURNS OF THE COMMUNICATIONS DRIVER ; .MACRO CDI$DF ; ; DEFINE I/O AND ERROR CODES FOR THE CD DRIVER ; .IF NDF RT11 IO.AWA=16400 ;AWAKE DR11W FROM SLEEP IO.CLN=3400 ;CLOSE LUN, REMOVE ALL PTC AFFINITIES IO.KIL=12 ;KILL QUEUED RECEIVES AND TRANSMITS IO.REJ=17400 ;REJECT MESSAGE IO.RLB=1000 ;READ/RECEIVE IO.RPA=15000 ;REMOVE PACKET TYPE CODE AFFINITY IO.SIG=17000 ;SEND SIGNAL IO.SPA=14400 ;SET PACKET TYPE CODE AFFINITY IO.STU=14000 ;RETURN DRIVER STATUS IO.WLB=400 ;WRITE/TRANSMIT SF.SLP=1 ;SLEEP AFTER THIS OPERATION SF.RSW=2 ;QUEUE PACKET EVEN IF LINK DOWN SF.RDQ=4 ;QUEUE READ EVEN IN NO MESSAGE PENDING ; .IFF ; ERRBYT = 52 ; ; ; OFFSETS INTO THE READ/WRITE REQUEST'S CONTROL ; AND STATUS AREA ; B$PTC = 0 ;OFFSET TO PACKET TYPE CODE (PTC) B$MSGN = 2 ;OFFSET TO MESSAGE BLOCK NUMBER B$ERR = 4 ;OFFSET TO ERROR CODE RETURNED BY ; ; THE DRIVER B$WC = 6 ;OFFSET TO WORD COUNT RETURNED BY ; ; THE DRIVER ; ; ERROR REPORTING ; ; (1) IMMEDIATE ERROR RESPONCE IN BYTE 52 E52PTC = 11 ;INVALID PTC E52CHN = 2 ;CHANNEL IS NOT OPEN E52MNS = 3 ;MAXIMUM NUMBER OF OPEN SESSIONS EXCEEDED E52SPF = 4 ;NO SESSION OPEN FOR THIS PTC ; ; (ON FUNC.=376) E52SES = 5 ;NO SESSION OPEN FOR THIS PTC E52BLK = 6 ;INVALID BLOCK ADDRESS GIVEN E52WCN = 7 ;WORD COUNT IS 0 E52ISF = 10 ;INVALID SPFUN CODE E.LKUP = 30 ;LOOKUP ERROR ON OPEN CHANNEL ; ; (NOT USED BY THE HANDLER; ; ; INCLUDED FOR CONSISTENCY ONLY) ; ; (2) FINAL ERROR RESPONCE IN B$ERR EFNSUC = 1 ;SUCCESSFUL - MESSAGE RECEIVED EFNDTR = -10 ;DATA RECEIVED/XMITTED WAS TRUNCATED EFNPTC = -20 ;PTC REJECTED - RECEIVER HAS NO OPEN SESSION ; ; FOR THIS PTC EFNTIO = -30 ;READ/WRITE REQUEST TIMEOUT (OPTIONAL) EFNHER = -40 ;HARDWARE ERRORS EFNTMX = -50 ;TIMEOUT DURING MESSAGE XFER EFNWRR = -60 ;WRITE REQUEST REJECTED - THE OTHER PARTY ; ; HAS NO READ FOR THIS PTC EFNABO = -70 ;I/O KILLED (BY THE OTHER PARTY) ; ; WHILE IN PROCESS EFNABY = -100 ;I/O KILLED (BY YOURSELF) ; ; WHILE IN PROCESS ; ; ; .PAGE ; ; SPECIAL FUNCTION DEFINITIONS: ; SFOPNR = 377 ;OPEN 'READ' SESSION SFCLSR = 376 ;CLOSE 'READ' SESSION SFDFRT = 375 ;SET NEW DEFAULT REQUEST TIMEOUT SFSGNL = 374 ;SEND SIGNAL SFSYNC = 373 ;RECEIVE SIGNAL IN SYNC MODE ; .ENDC ; ; .ENDM CDI$DF ;-------------------------------------------------------------------- ; ; ; ACTION - SAVE THE TYPE OF ACTION SUBROUTINE IS TO PERFORM ; .MACRO ACTION,TYPE MOV #TYPE,CD.FNC .ENDM ; ;-------------------------------------------------------------------- ; ; DRIVER - MAKE CALL TO COMMUNICATIONS DRIVER TO PERFORM ACTION ; .MACRO DRIVER ; ; THIS IS THE CODE TO MAKE THE ACTUAL CALL TO THE RSX DRIVER ; OR RT-11 HANDLER. ; THE INPUT PARAMETERS ARE SET UP IN REGISTERS AND IN ; VARIABLES IN THE COMMON AREA AS FOLLOWS ; ; R1 = ADDRESS OF MESSAGE BLOCK FOR THIS ACTION ; R2 = PACKET TYPE CODE ; R3 = BUFFER ADDRESS IF DATA TRANSFER INVOLVED, ; OR SIGNAL VALUE, ELSE 0 ; R4 = WORD COUNT FOR DATA TRANSFER ELSE 0 ; CD.FNC = I/O FUNCTION CODE ; CD.CUR = CURRENT FUNCTION STATUS BITS ; CD.MOD = MODE OF TRANSFER TO USE ; CD.OPE = ADDRESS OF OPEN CONNECTION MESSAGE BLOCK FOR THIS ; ACTION IF IT IS A RECEIVE ; ; ; R1 MUST BE PRESERVED IN THIS CODE ; ALL OTHER REGISTERS MAY BE DESTROYED ; ; ON EXIT FROM THIS MACRO CARRY SHOULD BE CLEAR UNLESS ; THERE HAS BEEN AN 'IMMEDIATE' OR DIRECTIVE ERROR IN THE ; ISSUING OF THE REQUEST TO THE DRIVER. ; ; .MCALL ASSUME ASSUME MB.CUR,0 ;CURRENT STATUS IS 1ST WORD OF MB MOV #ER.PND,MB.ST1(R1) ;SET STATUS TO PENDING ; .IF NDF RT11 ; .MCALL QIO$S,QIOW$S,WTSE$S,CLEF$S .ENABL LSB PUSH ;SAVE REGISTERS BISB CD.MOD,CD.FNC ;SET ANY SUBFUNCTION BITS ; ; FOR A RECEIVE OPERATION MUST CHECK IF IT IS TO BE ISSUED ; IMMEDIATELY AND QUEUED BY DRIVER OR IF WE ARE TO WAIT UNTIL ; THE AST IS ENTERED AND THE QIO ISSUED THERE ; BIT #S.RCV,(R1) ;RECEIVE OPERATION? BEQ 50$ ;IF NOT RECEIVE ALWAYS DO I/O BIT #QRCV,CD.MOD ;QUEUE I/O REQUEST? BEQ 15$ ;IF SO DO THE I/O NOW BIC #S.PMSG,@CD.OPE ;CLEAR PENDING MESSAGE FLAG BR 50$ 15$: MOV R3,MB.BUF(R1) ;SAVE BUFFER ADDRESS MOV R4,MB.PWC(R1) ;SAVE RECEIVE BUFFER WC MOVB MB.FLG(R1),R0 ;EF TO WAIT ON IF NECESSARY ; ; FOLLOWING CODE MUST TEST AND CLEAR IN CORRECT ORDER AS COULD ; BE INTERRUPTED BY THE AST. AFTER THE S.WRCV BIT IS SET (THIS ; BIT IS CHECKED BY THE AST) THE S.PMSG BIT IN THE OPEN CONNECTION ; MESSAGE BLOCK FOR THIS PTC IS CHECKED. IF SET THEN THE MESSAGE ; ARRIVED BEFORE THE S.WRCV BIT HAD BEEN SET SO AST ROUTINE HAS ; NOT DONE THE READ AND MUST BE DONE HERE IMMEDIATELY. ; CLEF$S R0 ;CLEAR EF BIS #S.WRCV,(R1) ;MARK AS BUFFER WAITING MOV CD.OPE,R0 ;ADDRESS OF OPEN CONNECTION MB CLC ;CLEAR CARRY FOR NON QUEUED RCV ;DEFAULT ERROR CODE BIT #S.PMSG,(R0) ;PENDING MESSAGE NOTED IN AST? BEQ 40$ ;BRANCH IF NO PENDING MESSAGE BIC #S.PMSG,(R0) ;ELSE CLEAR PENDING AND DO I/O BIC #S.WRCV,(R1) ;CLEAR THE BIT WHICH TELLS AST ;MESSAGE BLOCK HAS A RECEIVE ;BUFFER WAITING - WE ARE ABOUT ;TO USE THAT RECEIVE BUFFER ; ; CONVERT INPUT PARAMETERS TO QIO PARAMETERS ; 50$: TST R3 ;BUFFER USED BNE 51$ ;IF NON-ZERO R3 = BUFFER ADDRESS MOV R2,R3 ;ELSE P1=R3=PTC BR 53$ 51$: TST R4 ;BUFFER WC? BNE 52$ ;BRANCH IF GIVEN MOV (R3),R3 ;ELSE SIGNAL SO SET P1=R3=SIGNAL MOV R2,R4 ;AND P2=R4=PTC BR 53$ 52$: ASL R4 ;CONVERT P2=R4=BYTE COUNT ; ; NOW P1=R3, P2=R4 AND P3=R2 FOR ALL CASES ; 53$: MOV R1,R5 ;MSG BLOCK ADDRESS ADD #MB.ST1,R5 ;STATUS AREA ADDRESS MOVB MB.FLG(R1),R0 ;EF TO BE SET BIT #S.OPEN,(R1) ;OPEN QIO? BEQ 70$ ;BRANCH IF NOT MOV #$CDAST,R4 ;AST ADDRESS ON OPEN 70$: BIT #S.WAIT,(R1) ;WAIT FOR COMPLETION? BNE 72$ QIO$S CD.FNC,MB.CHN(R1),R0,,R5,CD.CRN, BR 100$ 72$: QIOW$S CD.FNC,MB.CHN(R1),R0,,R5,, BR 100$ 40$: BIT #S.WAIT,(R1) ;IS THIS A WAIT IO? BEQ 100$ ;BRANCH IF NOT - ALL SET UP ; ; WAIT FOR AST ROUTINE TO BE ENTERED TO DO QIO AND SO SET EF ; MOVB MB.FLG(R1),R0 ;EF TO WAIT ON WTSE$S R0 ;WAIT FOR COMPLETION OF I/O ;OR TIMEOUT. ;(FOR NON QUEUED READ QIO ;WILL BE DONE IN AST AND ;WAIT BIT CLEARED) 100$: POP ;RESTORE REGISTERS .DSABL LSB ; ; ; .IFF ; ; RT-11 VERSION. ; IT IS ASSUMED THAT THE RT-11 CD HANDLER IS FETCHED ; (OR LOADED) BY THE TIME THIS MACRO IS CALLED. ; ; .MCALL .READC,.READW,.WRITC,.WRITW,.SPFUN,.WAIT .GLOBL $CDCMP ;COMPLETION ROUTINE ; .ENABL LSB PUSH ;SAVE REGISTERS CLR R5 MOVB MB.CHN(R1),R5 ;GET CHANNEL NUMBER ; ; VERIFY THE I/0 COMMAND TO BE ISSUED ; BIT #S.OPEN,MB.CUR(R1) ;IS IT 'OPEN READ SESSION'? BNE 100$ ;IF NE YES BIT #S.CLOS,MB.CUR(R1) ;IS IT 'CLOSE READ SESSION'? BNE 200$ ;IF NE YES BIT #S.RCV,MB.CUR(R1) ;IS IT 'RECEIVE COMMAND'? BNE 300$ ;IF NE YES BIT #S.XMT,MB.CUR(R1) ;IS IT 'XMIT COMMAND'? BNE 400$ ;IF NE YES BIT #S.SIG,MB.CUR(R1) ;IS IT 'XMIT SIGNAL'? BNE 500$ ;IF NE YES JMP 7777$ ; ; PROCESS INDIVIDUAL COMMANDS ; ; OPEN READ SESSION 100$: MOV #EFNSUC,MB.ST1(R1) CLR MB.SNO(R1) ;INITIALIZE CDPACK SIGNAL NO MOV R1,R3 ;GET MSGE BLOCK POINTER ADD #MB.SIG,R3 ;GET SIGNAL AREA POINTER .SPFUN #10000$,R5,#SFOPNR,R3,,R2 JMP 7777$ ; ; CLOSE READ SESSION 200$: MOV #EFNSUC,MB.ST1(R1) ;$$$$$$$$$$$$$$$$$$$$$$=28-FEB-83=$$$$$$$$$$$$$$$$$$$$$$$BEGIN MOV R1,R3 ;GET MSGE BLOCK POINTER ADD #MB.SIG,R3 ;GET SIGNAL AREA POINTER .SPFUN #10000$,R5,#SFCLSR,R3,,R2 ;$$$$$$$$$$$$$$$$$$$$$$=28-FEB-83=$$$$$$$$$$$$$$$$$$$$$$$END BR 7777$ ; ; RECEIVE I/O COMMAND 300$: MOV R1,R2 ;GET MSGE BLOCK POINTER ADD #MB.PTC,R2 ;GET PTC POINTER BIT #S.WAIT,MB.CUR(R1) ;IS IT 'READ AND WAIT'? BNE 320$ ;IF NE YES ; READ WITH COMPLETION ROUTINE 310$: .READC #10000$,R5,R3,R4,#$CDCMP,R2 BR 7777$ ; ; READ AND WAIT 320$: .READW #10000$,R5,R3,R4,R2 BR 7777$ ; ; XMIT I/O COMMAND 400$: MOV R1,R2 ;GET MSGE BLOCK POINTER ADD #MB.PTC,R2 ;GET PTC POINTER BIT #S.WAIT,MB.CUR(R1) ;IS IT 'WRITE AND WAIT'? BNE 420$ ;IF NE YES ; WRITE WITH COMPLETION ROUTINE 410$: .WRITC #10000$,R5,R3,R4,#$CDCMP,R2 BR 7777$ ; ; WRITE AND WAIT 420$: .WRITW #10000$,R5,R3,R4,R2 BR 7777$ ; ; XMIT SIGNAL 500$: MOV (R3),R3 ;GET SIGNAL MOV R1,R2 ;GET MSGE BLOCK POINTER ADD #MB.PTC,R2 ;GET PTC POINTER BIT #S.WAIT,MB.CUR(R1) ;IS IT 'WRITE AND WAIT'? BNE 520$ ;IF NE YES ; WRITE WITH COMPLETION ROUTINE 510$: .SPFUN #10000$,R5,#SFSGNL,,R3,R2,#$CDCMP BR 7777$ ; ; WRITE AND WAIT 520$: .SPFUN #10000$,R5,#SFSGNL,,R3,R2 .WAIT R5 BR 7777$ ; 10000$: .BLKW 6 ;6-WORD EMT ARGUMENT BLOCK 7777$: POP ;RESTORE REGISTERS .DSABL LSB ; ; .ENDC ; .ENDM ; ;-------------------------------------------------------------------- ; ; TIMOUT - SET UP TIMEOUT ON DRIVER CALL ; .MACRO TIMOUT .IF NDF RT11 .MCALL MRKT$S .ENABL LSB TST CD.TMO ;TIMEOUT SET UP? BEQ 5$ ;BRANCH IF NOT TIMEOUT BIT #S.RCV,CD.CUR ;RECEIVE? BEQ 5$ ;BRANCH IF NOT RECEIVE BIT #RCVTMO,CD.MOD ;TIMEOUT ON RECEIVE? BEQ 5$ ;BRANCH IF NO TIMEOUT FOR RECEIVE MOVB MB.FLG(R1),R0 ;EF FOR CURRENT MESSAGE BLOCK MRKT$S R0,CD.TMO,CD.TMU ;SET UP MARK TIME 5$: .DSABL LSB .IFF CLC .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; CANTMO - CANCEL TIMEOUT ON DRIVER CALL ; .MACRO CANTMO .IF NDF RT11 .MCALL CMKT$S .ENABL LSB TST CD.TMO ;TIMEOUT SET UP? BEQ 5$ ;BRANCH IF NOT TIMEOUT BIT #S.RCV,CD.CUR ;RECEIVE? BEQ 5$ ;BRANCH IF NOT RECEIVE BIT #RCVTMO,CD.MOD ;TIMEOUT ON RECEIVE? BEQ 5$ ;BRANCH IF NO TIMEOUT FOR RECEIVE MOVB MB.FLG(R1),R0 ;EF FOR CURRENT MESSAGE BLOCK CMKT$S R0 ;CANCEL MARK TIME 5$: .DSABL LSB .IFF CLC ;CLEAR CARRY ONLY - NO ACTION .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; ERRSET - SET ERROR CODE FROM DRIVER CALL IN MB.ST1 WORD OF MESSAGE ; BLOCK ; R1 = ADDRESS OF CURRENT MESSAGE BLOCK ; .MACRO ERRSET .IF NDF RT11 MOV $DSW,MB.ST1(R1) .IFF MOVB @#ERRBYT,MB.ST1(R1) ;SET DEFAULT ERROR CODE CMPB @#ERRBYT,#1 ;IS ERROR BYTE INDICATING HARD ERROR BNE 777$ ;IF NOT MUST BE INVALID CHANNEL ERROR MOV #ER.ARG,MB.ST1(R1) 777$: .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; RESETF - CLEAR EVENT FLAG FOR THE CHANNEL BEFORE WAITING ON IT ; .MACRO RESETF .IF NDF RT11 ; EXPECTS EVENT FLAG TO BE RESET TO BE IN R0 .MCALL CLEF$S CLEF$S R0 .IFF .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; RESETM - RESET ALL EVENT FLAGS FOR ALL CHANNELS IN USE ; .MACRO RESETM .IF NDF RT11 ; EXPECTS MASK OF EVENT FLAGS TO BE RESET TO BE IN R0 .MCALL CLEF$S,PUSH,POP PUSH ;SAVE REGISTERS CLR R1 1$: INC R1 ;NEXT EVENT FLAG NUMBER ASR R0 ;SHIFT TO GET NEXT SIGNIFICANT BIT BCC 2$ ;IF LOW BIT WAS NOT ON CLEF$S R1 ;ELSE EF NUMBER IN R1 2$: TST R0 ;ANY MORE FLAGS LEFT? BNE 1$ ;LOOP BACK IF MORE FLAGS POP ;ELSE RESTORE REGISTERS .IFF .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; FWAIT - WAIT ON EVENT FLAG ; .MACRO FWAIT .IF NDF RT11 ; EXPECTS EVENT FLAG TO WAIT ON TO BE IN R0 .MCALL WTSE$S WTSE$S R0 .IFF .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; MWAIT - WAIT ON MASK OF EVENT FLAGS ; .MACRO MWAIT .IF NDF RT11 ; EXPECTS EVENT FLAG MASK TO WAIT ON TO BE IN R0 .MCALL WTLO$S WTLO$S 0,R0 .IFF .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; FSTOP - STOP ON EVENT FLAG ; .MACRO FSTOP .IF NDF RT11 ; EXPECTS EVENT FLAG TO STOP ON TO BE IN R0 .MCALL STSE$S STSE$S R0 .IFF .ENDC .ENDM ; ;-------------------------------------------------------------------- ; ; MSTOP - STOP ON MASK OF EVENT FLAGS ; .MACRO MSTOP .IF NDF RT11 ; EXPECTS EVENT FLAG MASK TO STOP ON TO BE IN R0 .MCALL STLO$S STLO$S 0,R0 .IFF .ENDC .ENDM ; ;-------------------------------------------------------------------- .LIST