.TITLE DNDRV .IDENT /01.02/ ; B. HAZARD 24-OCT-79 ; DN11 AUTOMATIC CALLING UNIT INTERFACE DRIVER ; MACRO LIBRARY CALLS .MCALL ABODF$,HWDDF$,PKTDF$ ABODF$ ; DEFINE TASK ABORT CODES HWDDF$ ; DEFINE HARDWARE REGISTERS PKTDF$ ; DEFINE I/O PACKET OFFSETS ; EQUATED SYMBOLS ; DN11 CONTROL & STATUS FCRQ = 1 ;CALL REQUEST FDPR = 2 ;DIGIT PRESENT MINAB= 4 ;MASTER ENABLE FPND = 20 ;PRESENT NEXT DIGIT DSS = 40 ;DATA SET STATUS INTENB= 100 ;INTERRUPT ENABLE DONE = 200 ;DONE FDLO = 10000 ;DATA LINE OCCUPIED ACR = 40000 ;ABANDON CALL & RETRY PWI = 100000 ;POWER INDICATOR C.NALL= DSS+ACR+PWI ; DN-11 DEVICE DRIVER FOR RSX11M, V3.1 - V3.2 ; THE DN-11 DRIVER WAS DEVELOPED TO SUPPORT AUTO-CALL PROCE- ; DURES UNDER RSX-11M. THE DRIVER IS IMPLIMENTED AS A ; USER WRITTEN DRIVER, NON-LOADABLE. IT SUPPORTS ONLY ONE ; PHYSICAL DEVICE, WITH A MAXIMUM OF FOUR OUTPUT PORTS. ; THE DN-11 DRIVER HANDLER USES STANDARD RSX-11 QIO FUNCTIONS. ; ATTACHES AND DETACHES ARE NOT PROCESSED BY THE DEVICE ; DRIVER. ; QIO$ IO.WLB,LUN,EF,PRI,IOSB,AST, ; THE BUFFER ADDRESS (BA) IS THE ADDRESS OF SUCCESSIVE ; BYTES IN THE REQUESTING TASK'S ADDRESS SPACE CONTAINING ; THE DIGITS THAT ARE TO BE DIALED. THE DIGITS SHOULD BE ; BINARY IN THE RANGE OF 0-9, BUT SINCE THE DN-11 INTER- ; FACE WILL ACCEPT ONLY THE FOUR LEAST SIGNIFICANT DIGITS ; OF THE BYTE, ASCII MAY ALSO WORK. DEPENDING ON WHAT ; ACU IS BEING USED, NUMBERS GREATER THAN 9 (DECIMAL) MAY ; BE USED AS CONTROL CHARACTERS, SUCH AS END-OF-NUMBER OR ; TANDEM DIALING. ; ; THE BYTE COUNT (BC) MUST BE THE NUMBER OF DIGITS TO BE ; PRESENTED TO THE ACU. IT MUST BE VALID REGARDLESS OF ; WHETHER AN END-OF-NUMBER DIGIT IS USED. ; QIO$ IO.KIL,LUN,EF,PRI,IOSB,AST ; KILL WILL ABORT THE CURRENT OPERATION AND CLEAR THE ; SPECIFIED UNIT'S STATUS. ; ; I/O COMPLETION ; ; THE DNDRV ACT AS ANY RSX-11M DEVICE DRIVER AS FAR AS QUEUING ; AND I/O COMPLETION. THE FOLLOWING IS A LIST OF POSSIBLE I/O ; COMPLETIONS. ; ; IS.SUC (+1) ; THE OPERATION WAS SUCCESSFUL. THIS INDICATES THAT THE ; CALLED PARTY ANSWERED, THAT THE ANSWER TONE WAS SUC- ; CESSFULLY DETECTED, AND MODEM COUPLER CUT-THRUOGH HAS ; OCCURRED. ; IE.TMO (-74.) ; AFTER THE LAST DIGIT WAS PRESENTED TO THE AUTO-DIALER, ; NO INTERRUPT WAS RECEIVED FROM THE DEVICE IN THE SYSTEM ; UNIT TIME-OUT TIME. THAT PARTICULAR VALUE IS SET IN ; THE SCB OF THE SYSTEM DATA BASE FOR THE DEVICE AND MAY ; BE SET TO A MINIMAL VALUE BASED ON WHAT TYPE OF TELE- ; PHONE LINES BEING USED. ; IE.CNR (-73.) ; DATA LINE IS CURRENTLY OCCUPIED, EITHER A SYSTEM ERROR ; IN I/O QUEUING OR THE DEVICE DID NOT SUCCESSFULLY CLEAR ; AFTER THE LAST OPERATION. ; IE.NFW (-69.) ; THE ACU HAS INTERUPTED WITH ABANDON CALL AND RETRY ; (ACR) SET. EITHER IT DID NOT DETECT ANSWER TONE, OR ; THE ACU TIMED OUT WAITING FOR THE ANSWER. THE TIME-OUT ; PERIOD MAY BE STRAPPED IN THE ACU AND SHOULD BE SET ; SIMILAR TO THE SYSTEM DATA BASE TIME-OUT VALUE. ; IE.DNR (-3) ; INDICATES A LOSS OF POWER DURING A DIALING SEQUENCE OR ; CURRENTLY. THIS INDICATES THAT ONLY THE ACU DOES NOT ; HAVE POWER, NOT THE ENTIRE SYSTEM. ; IE.ABO (-15.) ; OPERATION WAS ABORTED BY THE QIO IO.KIL OPERATION, OR ; THE SYSTEM JUST PERFORMED A POWER FAIL RECOVERY. ;CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER) I$=0 CNTBL: .REPT DN$$04 .IRP I$$,<\I$> .WORD .DN'I$$ .ENDR I$=I$+1 .ENDR .WORD 0 ;TERMINATE VECTOR ; DRIVER DISPATCH TABLE $DNTBL::.WORD DNINI ; DEVICE INITIATOR ENTRY POINT .WORD DNCAN ;CANCEL I/O ENTRY .WORD DNOUT ;TIMEOUT ENTRY .WORD DNPWF ;POWER FAIL ENTRY ; DNINI -DN11 ACU INTERFACE CONTROLLER INITIATOR ; THIS ROUTINE IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUEST ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE ; EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY,THEN ; AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO ; CALLER IS EXECUTED.IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THE NEXT I/O ; OPERATION IS INITIATED. A RETURN TO CALLER IS THEN EXECUTED. ; INPUTS: ; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; OUTPUTS: ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAITING ; TO BE PROCESSED,THEN THE REQUEST IS DEQUEUED AND THE I/O OPERATION IS ; INITIATED. .SBTTL DNINI - DEVICE INITIALIZATION ENTRY POINT DNINI: MOV #IE.OFL&377,R0 ; ASSUME UNIT OFFLINE TSTB U.ST2(R5) ; IS THE DEVICE OFFLINE? BMI DNDONE ; THE JUST EXIT VIA $IODON CALL $GTPKT ; GET I/O PACKET BCS DNPWF ; IF BUSY OR NO REQUEST ;+ ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; R1=ADDRESS OF I/O PACKET. ; R2=PHYSICAL UNIT # OF REQUEST UCB. ; R3=CONTROLLER INDEX. ; R4=ADDRESS OF SCB. ; R5=ADDRESS OF UCB OF CONTROLLER TO BE INITIATED. ;- MOV #IE.DNR&377,R0 ;ASSUME DEVICE NOT READY BIT #,@S.CSR(R4) ;TEST FOR BOTH BMI DNDONE ;IF MINUS, IT WAS PWI BEQ DNRDY ;IF .EQ., THEN READY FOR USE MOV #IE.CNR&377,R0 ;ELSE IT'S CONNECTION REJECT .SBTTL DNDONE - I/O OPERATION IS COMPLETE DNDONE: BIC #^C,@S.CSR(R4) ;CLEAR ALL BUT MASTER ENABLE CLRB S.CTM(R4) ;CLEAR TIMER CELL MOVB U.UNIT(R4),R1 ;SET UNIT NUMBER IN R1 CALLR $IODON ;FINISH OFF PACKET .SBTTL DNRDY - DEVICE READY FOR I/O INITIATION DNRDY: BIC #^C,@S.CSR(R4) ;RESET ALL STATUS BIS #,@S.CSR(R4);SET LINE ENABLE AND CALL REQST MOVB S.ITM(R4),S.CTM(R4) ;AND START A TIMER BIS #MINAB,@$DN0+S.CSR ;AND SET MASTER ENABLE .SBTTL DNPWF - POWER FAIL ENTRY AND COMMON EXIT DNPWF: RETURN .SBTTL $DNINT - INTERUPT SERVICE ROUTINE $DNINT:: CALL $INTSV,PR4 ;;;SAVE REGISTERS AND SET PRIORITY MOV R0,-(SP) ;;;SAVE R0 ON STACK ;;;DN11 INTERRUPT SERVICE ROUTINE CLR R0 ;;;INIT INDEX 10$: MOV CNTBL(R0),R5 ;;;GET A UCB ADDRESS FROM THE VECTOR BEQ 60$ ;;;NO MORE UCB'S... TSTB U.ST2(R5) ;;;IS THE UNIT OFFLINE? BNE 50$ ;;;IF .NE., YES MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS TSTB @S.CSR(R4) ;;;DONE SET BPL 50$ ;;;IF .PL., THEN NO MOVB S.ITM(R4),S.CTM(R4) ;;;RESET THE TIME COUNT MOV S.CSR(R4),R4 ;;;THEN POINT R4 TO CSR BIC #DONE,(R4) ;;;CLEAR THE DONE BIT BIT #C.NALL,(R4) ;;;ANY SPECIAL INTERRUPTS? BNE 20$ ;;;IF .NE., YES BITB #FPND,(R4)+ ;;;CAN WE NOW SUPPLY A DIGIT?? BEQ 50$ ;;;NO, SKIP THE INTERRUPT TST U.CNT(R5) ;;;ANY BYTES LEFT?? BEQ 50$ ;;;NO, THEN LINE WILL TIME OUT (?) .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE KERNAL MAP MOV U.BUF(R5),@#KISAR6 ;;;LOAD KERNAL MAP TO USER BUFFER .IFTF ;;; MOVB @U.BUF+2(R5),(R4) ;;;LOAD BYTE TO DATA REGISTER .IFT ;;; MOV (SP)+,@#KISAR6 ;;;RESTORE KERNAL MAPPING .ENDC ;;; DEC U.CNT(R5) ;;;REDUCE BYTE COUNT INC U.BUF+2(R5) ;;;AND UPDATE ADDRESS BISB #FDPR,-(R4) ;;;SET DIGIT PRESENTED IN STATUS REG BR 50$ ;;;AND GO POLL NEXT UNIT 20$: MOV (SP)+,R0 ;;;RESTORE R0 FROM STACK BIC #INTENB,(R4) ;;;DISABLE THIS UNIT MOV U.SCB(R5),R4 ;;;RESTORE SCB ADDRESS CLRB S.CTM(R4) ;;;RESET TIMER CALL $FORK ;;;CREATE A SYSTEM PROCESS MOV #IE.DNR&377,R0 ;ASSUME A POWER FAILURE BIT #,@S.CSR(R4) ;TEST TWO STATUS AT ONCE BMI DNDONE ;IF .MI., THEN PWI BEQ 30$ ;IF .EQ., THEN SUCCESSFUL (DSS) MOV #IE.NFW&377,R0 ;ASSUME ABANDON CALL AND RETRY BR DNDONE ;AND BRANCH 30$: MOV #IS.SUC,R0 ;HAS TO BE SUCCESSFUL (DSS) 40$: BR DNDONE ;CLEAR STATUS AND FINISH PACKET 50$: TST (R0)+ ;;;POINT UCB INDEX TO NEXT UNIT BR 10$ ;;;AND BRANCH BACK 60$: MOV (SP)+,R0 ;;;RESTORE R0 RETURN ;;; .SBTTL DNCAN - CANCEL I/O ENTRY POINT DNCAN: CMP R1,I.TCB(R0) ;;; REQ FOR CURRENT TASK BNE 10$ ;;; MOV #IE.ABO&377,R0 ;;; ABORT THIS REQ BR DNDONE ;;; FINISH OFF PACKET 10$: RETURN ;;; .SBTTL DNOUT - TIMEOUT ENTRY POINT DNOUT: MOV #IE.TMO&377,R0 ;;; ABORT CODE BR DNDONE ;;;SET IOSB AND FINISH OFF PACKET .END