.TITLE YTDRV .IDENT /12.2XB/ ; DL DRIVER - TRANSMIT ONLY ; REMOVE NEXT LINE IF RESIDENT DRIVER LD$YT=0 ; ; DL11 ASYNCHRONOUS COMMUNICATIONS DRIVER ACTING AS TT PORT ; ; MACRO LIBRARY CALLS ; .MCALL HWDDF$,PKTDF$ HWDDF$ ;DEFINE HARDWARE REGISTERS PKTDF$ ;DEFINE I/O PACKET OFFSETS .MCALL UCBDF$,CUCDF$ UCBDF$ ; DEFINE UCB OFFSETS CUCDF$ ;COMMUNICATIONS UCB LABELS ; ; CONFIGURATION DEPENDENT PARAMETERS ; ; ; EQUATED SYMBOLS ; ; ; RXCSR BIT ASSIGNMENTS ; DTSTCH= 100000 ;DATA SET CHANGE RING= 40000 ;RING LINE ASSERTED CTS= 20000 ;CLEAR TO SEND CRRIER= 10000 ;CARRIER STATE RECACT= 4000 ;RECEIVER ACTIVE RXDONE= 200 ;RECEIVER DONE RCVENB= 100 ;RECEIVER INTERRUPT ENABLE DSINTE= 40 ;DATA SET CHANGE INTERRUPT ENABLE RTS= 4 ;REQUEST TO SEND TRMRDY= 2 ;DATA TERMINAL READY ; ; RXDBUF BIT ASSIGNMENTS ; RXERR= 100000 ;RECEIVER ERROR "OR" BIT OVRNER= 40000 ;RECEIVER OVERRUN ERROR IF SET FRMERR= 20000 ;RECEIVER FRAMING ERROR ; ; TXCSR BIT ASSIGNMENTS ; TXRDY= 200 ;TRANSMITTER DONE BIT TXINTE= 100 ;TRANSMITTER INTERRUPT ENABLE BIT BREAK= 1 ;CLAMP OUTPUT TO SPACE ; ; LOCAL DATA ; ; ; UNIT IMPURE DATA TABLE (INDEXED BY UNIT, POINTS TO UCB) ; D$$E11=1 CNTBL: ;REF LABEL UNITBL: ;UCB ADDRESSES .REPT D$$E11 .WORD 0 ;ENSURE SET TO ZERO .ENDM .IF GT D$$E11-1 TEMP: ;REF LABEL UNIT: .BLKW 1 ;TEMPORARY STORAGE FOR UNIT NUMBER .ENDC .ENABL LSB ; ; DRIVER DISPATCH TABLE ; $YTTBL::.WORD DLINIT ;DEVICE INITIALIZATION .WORD DLCANC ;DEVICE I/O CANCELLATION .WORD DLTMO ;TIMEOUT ENTRY POINT .WORD DLPWRF ;POWER FAIL ROUTINE ;+ ;**- DLINIT - DL-11 SYNCHRONOUS COMMUNICATION CONTROLLER I/O INITIATOR ; ; DLINIT IS ENTERED WHEN AN I/O REQUEST IS QUEUED ON THE DEVICE, ; AND AT THE END OF EACH QIO REQUEST WHICH OBEYS THE ; NORMAL RSX-11M INPUT/OUTPUT LOGIC FLOW. IF THE DEVICE IS ; AVAILABLE AND A REQUEST IS IN THE QUEUE FOR THAT UNIT, ; THE REQUEST IS INITIATED. ; IF NO REQUEST EXISTS FOR THAT UNIT OR IF IT IS ; BUSY, AN EXIT IS TAKEN TO THE CALLER. NOTE THAT BECAUSE OF ; THE NATURE OF THE DL-11, EACH UNIT IS A CONTROLLER ITSELF, ; HAS ITS OWN SCB, AND THEREFORE ITS OWN QUEUE. ; EACH TIME DLINIT IS CALLED, IT IS CALLED TO SERVICE ONLY ; THE UNIT SPECIFIED IN THE CALL. NOTE ALSO THAT ONLY ; 8-BIT, NO PARITY DATA IS SUPPORTED. ; ; INPUTS: ; ; R4 = STATUS CONTROL BLOCK ADDRESS ; R5 = ADDRESS OF THE UCB TO BE INITIATED. ; ; OUTPUTS: ; ; IF A REQUEST IS SUCCESSFULLY DEQUEUED, THE ; DEVICE IS INITIATED APPROPRIATELY. ;- .IIF NDF,$$XDT,NRM$YD=0 ;ASSEMBLE WITHOUT BPT IF NO ZDT DLINIT: .IF DF,NRM$YD ; NOP .IFF BPT ;DEBUG XDT CALL VERSION .ENDC CALL $GTPKT ;GET AN I/O PACKET TO PROCESS BCS 15$ ;NO REQUEST OR UNIT BUSY ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1 = ADDRESS OF THE I/O REQUEST PACKET. ; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3 = CONTROLLER INDEX ; R4 = ADDRESS OF THE STATUS CONTROL BLOCK. ; R5 = ADDRESS OF THE UCB SPECIFIED IN THE ; DLINIT CALL. ; ; SAVE UNIT UCB ADDRESS FOR INT VECTOR... ; ; NOTE: FOR MULTI-UNIT HANDLER MUST USE UNITBL(R3) INSTEAD ; OF UNITBL... CHECK IF R3 IS A BYTE OR WORD OFFSET ALSO... MOV R5,UNITBL ;SAVE UNIT NO. ; ; ; DL11 I/O REQUEST PACKET FORMAT ; ; WORD CONTENT ; ; 0 I/O QUEUE THREAD WORD ; 1 REQUEST PRIORITY, EVENT FLAG NUMBER ; 2 ADDRESS OF THE TCB OF THE REQUESTER TASK ; 3 POINTER TO SECOND LUN WORD IN TASK HEADER ; 4 CONTENTS OF FIRST LUN WORD (UCB) ; 5 I/O FUNCTION CODE ; 6 VIRTUAL ADDRESS OF I/O STATUS BLOCK ; 7 RELOCATION BIAS OF I/O STATUS BLOCK ; 10 I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000) ; 11 VIRTUAL ADDRESS OF AST SERVICE ROUTINE ; 12 RELOCATION BIAS OF I/O BUFFER ; 13 BUFFER ADDRESS FOR TRANSFER ; 14 TOTAL BYTE COUNT TO TRANSFER ; 15 BYTE COUNT FOR SECOND PART OF TRANSMISSION OR 0 ; 16 NOT USED ; 17 NOT USED ; 20 NOT USED ; MOV S.CSR(R4),R2 ;GET CSR ADDRESS ADD #I.FCN+1,R1 ;POINT TO I/O FUNCTION CODE CMPB #IO.RVB/256.,(R1);READ VIRTUAL? BEQ 20$ ; IF SO TREAT LIKE READ LOGICAL CMPB #IO.WVB/256.,(R1);WRITE VIRT? BEQ 24$ ;IF SO GO HANDLE CMPB #IO.INL/256.,(R1) ;CHECK IF TRANSFER FUNCTION BLOS 40$ ;BRANCH ON CONTROL FUNCTION CMPB #IO.RLB/256.,(R1) ;READ LOGICAL? BEQ 20$ ;YES, SERVICE READ REQUEST ; ; FALL THROUGH ON TRANSMIT (WRITE LOGICAL) ; 24$: MOVB S.ITM(R4),S.CTM(R4) ;INITIALIZE TIMEOUT COUNT 10$: BIS #TXINTE,(R2) ;ENABLE TRANSMITTER 15$: BR 140$ ;RETURN, INTERRUPT PROPAGATES TX ; ; RECEIVE FUNCTION INITIATION ; 20$: ;REFERENCE LABEL 30$: ;REF LABEL BR DLSUCC ;DUMMY SUCCESS FOR RECEIVE ON ; TRANSMIT DRIVER... ; ; CONTROL FUNCTION INITIATION (INITIATE OR TERMINATE CONTROLLER, ; OR CHANGE OPERATING MODE) ; 40$: BNE 70$ ;IF NOT EQUAL, MODE CHANGE REQUEST ;WMG015 CLR (R2) ;CLEAR RXCSR ; ; DO START FUNCTION INITIATION ; MOV R5,UNITBL(R3) ;INITIALIZE UCB ADDRESS IN UNIT TABLE BR 120$ ;RETURN SUCCESSFUL ; ; SERVICE DEVICE MODE CHANGE REQUEST ; 70$: ; DLSUCC: ;REFERENCE LABEL 120$: MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUS DLFIN: ;REFERENCE LABEL 130$: CLRB S.STS(R4) ;CLEAR CONTROLLER STATUS BICB #US.BSY,U.STS(R5) ;CLEAR UNIT STATUS MOV R0,-(SP) ;SAVE STATUS WORD 1 MOV S.PKT(R4),-(SP) ;SAVE PACKET ADDRESS CALL DLINIT ;ATTEMPT TO INITIATE SOMETHING MOV (SP)+,R3 ;RESTORE PACKET ADDRESS MOV I.PRM+4(R3),R1 ;RETURN REQUESTED COUNT MOV (SP)+,R0 ;RESTORE STATUS WORD 1 CALLR $IOFIN ;TERMINATE LAST PACKET 140$: RETURN ; ; POWER FAIL SERVICE ; DLPWRF: ;REFERENCE LABEL CLRB S.CTM(R4) ;DISABLE TIMEOUTS MOV #IE.DNR&377,R0 ;NOT RDY BR 130$ ;FINISH I/O ; ; I/O CANCELLATION ; DLCANC: ;;;REFERENCE LABEL CMP R1,I.TCB(R0) ;;;CANCEL FOR THIS TASK? BNE 140$ ;;;JUST RETURN IF NOT ;;; LET THE ENTRY FALL THRU TO TIME-OUT ENTRY IF IT'S FOR THIS TASK ;;; TO TURN OFF XMIT INTERRUPT... ; BR 150$ ;;;FINISH OFF I/O ; ; TIMEOUT SERVICE ROUTINE ; ; INPUTS: ; ; R0 = DEVICE TIMEOUT STATUS 'IE.DNR' ; R3 = CONTROLLER INDEX ; R4 = ADDRESS OF SCB ; R5 = ADDRESS OF UCB ; DLTMO: ;;;TIMEOUT ENTRY POINT MOV S.CSR(R4),R3 ;;;GET CSR BIC #TXINTE,(R3) ;;;DISABLE TRANSMITTER 150$: ;;;REFERENCE LABEL MTPS #0 ;;;ALLOW INTERRUPTS JMP DLTXND ;;;WAIT FOR SOFTWARE TIMEOUT TO FINISH .DSABL LSB ; ; **- $YTINT - TRANSMITTER INTERRUPT SERVICE ; $YTINT:: ;;;REFERENCE LABEL INTSV$ YT,PR5,D$$E11 ;;;GENERATE INTERRUPT SAVE CODE CALL DLSET ;;;SET CSR IN R4, UCB IN R5 DEC U.CNT(R5) ;;; CHECK COUNT BLT 50$ 20$: CALL $GTBYT ;;;GET NEXT BYTE FROM BUFFER MOVB (SP)+,2(R4) ;;;OUTPUT CHARACTER 30$: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS BACK MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT RETURN ;;;EXIT INTERRUPT 40$: ;;;REFERENCE LABEL 50$: BIC #TXINTE,(R4) ;;;DISABLE TRANSMITTER CALL $FORK ;;;CREATE SYSTEM PROCESS MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUS DLTXND: ;REFERENCE LABEL MOV U.SCB(R5),R4 ;RESTORE SCB TO R4 JMP DLFIN ;MARK COMPLETION ; ; DLSET - SET UP REGISTER R4 WITH CSR ADDRESS, R5 WITH ; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT. ; DLSET: ;;;REFERENCE LABEL TST R5 ;;;CHECK FOR UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE MOV U.SCB(R5),R4 ;;;FIRST GET SCB ADDRESS MOV S.CSR(R4),R4 ;;;NOW DEVICE CSR ADDRESS RETURN ;;;AND NOW RETURN 10$: TST (SP)+ ;;;CLEAR STACK OF RETURN ADDRESS DLSXT: JMP $INTXT ;;;DISMISS INTERRUPT .END