.NLIST .TITLE CDDRV .IDENT /V003/ ; ; 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 ; ; ++ ; ; 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.SPA=14400 ;SET PACKET TYPE CODE AFFINITY IO.RPA=15000 ;REMOVE PACKET TYPE CODE AFFINITY IO.AWA=16400 ;AWAKE DR11W FROM SLEEP IO.SIG=17000 ;SEND SIGNAL IO.REJ=17400 ;REJECT MESSAGE IO.CLN=3400 ;CLOSE LUN, REMOVE ALL PTC AFFINITIES IO.STU=14000 ;RETURN DRIVER STATUS IO.RLB=1000 ;READ/RECEIVE 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 IE.COL=-87. ;COLLISION ERROR IE.DNE=-88. ;PTC DOES NOT EXIST IE.NDS=-89. ;UNIT DISCONNECTED IE.NEX=-90. ;NONEXISTENT STATE (DRIVER FAILURE) IE.NRP=-91. ;NO READ PENDING IE.PTO=-92. ;PACKET TYPE CODE OWNED IE.SNA=-93. ;SIGNAL NOT ACKNOWLEDGED IE.VIU=-94. ;VECTOR IN USE ON AWAKE IE.IOQ=-95. ;I/O STILL QUEUED TO PDB ON IO.CLN OR IO.RPA IE.LDN=-96. ;LINK DOWN, AND RESOURCE WAIT NOT SPECIFIED ; .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 MAILBOX 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 ; .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.WRCV,(R1) ;ALREADY WAITING TO ISSUE RECEIVE BNE 50$ ; IF SO DO THE I/O NOW BIT #S.RCV,CD.CUR ;RECEIVE OPERATION? BEQ 50$ ;IF NOT RECEIVE ALWAYS DO I/O BIT #QRCV,CD.MOD ;QUEUE I/O REQUEST? BNE 50$ ;IF SO DO THE I/O NOW 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 ; ; 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,CD.CUR ;OPEN QIO? BEQ 70$ ;BRANCH IF NOT MOV #$CDAST,R4 ;AST ADDRESS ON OPEN 70$: BIT #S.WAIT,(R1) ;WAIT FOR COMPETION? BNE 72$ QIO$S CD.FNC,MB.CHN(R1),R0,,R5,CD.CRN, BCS 100$ ;IF DIRECTIVE ERROR BR 75$ 72$: QIOW$S CD.FNC,MB.CHN(R1),R0,,R5,CD.CRN, BCS 100$ 75$: BIC #S.WRCV,(R1) ;NOT WAITING TO DO I/O NOW BR 100$ 40$: ; 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 MOV #ER.PND,MB.ST1(R1) ;SET STATUS TO PENDING ; ; 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 ; NOTE *** temporary mod to allow package to work with SIGNAL ; version of RT driver. Oct1282. Signal area temporarily defined ; as pending word count field ; ; ADD #MB.PWC,R3 ;Signal area pointer ; **** ;******************************************************** ADD #MB.SIG,R3 ;GET SIGNAL AREA POINTER ; NOTE *** temporary mod reversed to debug SIGNAL version of RT driver .SPFUN #10000$,R5,#SFOPNR,R3,,R2 JMP 7777$ ; ; CLOSE READ SESSION 200$: MOV #EFNSUC,MB.ST1(R1) .SPFUN #10000$,R5,#SFCLSR,,,R2 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 .ENABLE 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 BIT #S.WAIT,CD.CUR ;RECEIVE AND WAIT OPERATION? BEQ 5$ ;NO TIMEOUT IF NOT WAIT MOVB MB.FLG(R1),R0 ;EF TO BE SET ON TIMEOUT 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 MOVB MB.FLG(R1),R0 ;EF FOR CURRENT MESSAGE BLOCK CMKT$S R0 ;CANCEL MARK TIME .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 ; ;-------------------------------------------------------------------- ; ; WAIT - WAIT ON EVENT FLAG ; .MACRO WAIT .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 ; ;-------------------------------------------------------------------- ; ; RESETM - RESET ALL EVENT FLAGS FOR ALL CHANNELS IN USE ; .MACRO RESETM .IF NDF RT11 ; THE MASK OF ALL FLAGS USED BY ALL CHANNELS IS IN CD.MSK .MCALL CLEF$S,PUSH,POP PUSH ;SAVE REGISTERS MOV CD.MSK,R1 ;MASK OF ALL EVENT FLAGS CLR R0 1$: INC R0 ;NEXT EVENT FLAG NUMBER ASR R1 ;SHIFT TO GET NEXT SIGNIFICANT BIT BCC 2$ ;IF LOW BIT WAS NOT ON CLEF$S R0 ;ELSE EF NUMBER IN R0 2$: TST R1 ;ANY MORE FLAGS LEFT? BNE 1$ ;LOOP BACK IF MORE FLAGS POP ;ELSE RESTORE REGISTERS .IFF .ENDC .ENDM ; ; ;-------------------------------------------------------------------- .LIST