.TITLE XADRV .IDENT /2.0/ ;--------------------------------------------------------------+ ; RSX11M Driver for DRV11-WA 16-Bit DMA Interface + ; + ; Author: + ; N.Wiehl + ; Universitaet Mainz + ; Institut fuer Kernchemie + ; + ; December 1986 + ;--------------------------------------------------------------+ ; edit history: + ; ============= + ; + ; version 0.1 28-NOV-86 first try + ; version 1.0 11-MAY-87 change for use with ND-KC Bus + ; version 2.0 02-NOV-88 DMA transfer into + ; common partition NDDATA + ;--------------------------------------------------------------+ ; *** ND-KC-Bus description + ; + ; Designed by + ; U. Tharun + ; Universitaet Mainz + ; Institut fuer Kernchemie + ; + ; Mai 1987 + ; + ; A maximum of 16 ND66 may be conected + ; to a single DR(V)11W-DMA Interface via DRV-11 16 bit + ; parallel interfaces. Transfer is intitated with + ; csr1 bit (BIT1)=1. Bus ready is indicated with + ; REQA (BIT7) =1. First word transfered after actvating + ; with CSR1=1 is formed by bus logic, containing a + ; station address in the lower 4 bit and the lower 4 + ; bits DRV11 data buffer register in upper 4 bits. Content+ ; of the upper byte of this first word is randomly. This + ; allows transfer of a 4 bit function code with initiating+ ; the transfer. Function code must be written into the DBR+ ; BEFORE activating the transfer. + ; + ;---------------------------------------------------------------- ; ; ; ASSEMBLING XADRV: ; ; MAC XADRV=[1,1]EXEMC/ML,[11,10]RSXMC/PA:1,[g,m]XADRV ; MAC XATAB=[1,1]EXEMC/ML,[11,10]RSXMC/PA:1,[g,m]XATAB ; ; BUILDING XADRV: ; ; TKB>[1,54]XADRV/-HD/-MM,,[1,54]XADRV= ; TKB>[g,m]XADRV,XATAB ; TKB>[1,54]RSX11M.STB/SS ; TKB>[1,1]EXELIB/LB ; TKB>/ ; TKB>STACK=0 ; TKB>PAR=GEN:120000:2000 ; TKB>// ; ; Other requirements: ; create common partition NDDATA ; assemble, link and install NDDATA ; data will be directly transferred into this partition ; ; MACRO LIBRARY CALLS ; .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$,PCBDF$ ABODF$ ;DEFINE TASK ABORT CODES HWDDF$ ;DEFINE HARDWARE REGISTER SYMBOLS PKTDF$ ;DEFINE I/O PACKET OFFSETS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS ; PARNAM: .RAD50 /NDDATA/ ;PARTITION NAME ; ; DRV11-WA device register offsets ; DRVWCR=0 ;word count register DRVBAR=2 ;bus address register DRVBAE=2 ;extended bus address register (Q22 bus) DRVCSR=4 ;control status register DRVDBR=6 ;data buffer register ; ; DRVCSR bit assignments ; GO= 1 ;initiate DMA FNCT1= 2 ;output line FCNT 1 FNCT2= 4 ;output line FCNT 2 FNCT3= 10 ;output line FCNT 3 XAD16= 20 ;bus address extension bit 17 (ignored with Q22) XAD17= 40 ;bus address extension bit 18 (ignored with Q22) IE= 100 ;interrupt enable READY= 200 ;device idle CYCL= 400 ;dma cycle STATC= 1000 ;input line STATUS A STATB= 2000 ;input line STATUS B STATA= 4000 ;input line STATUS C MAINT= 10000 ;Maintenance mode ATTN= 20000 ;attention signal NEX= 40000 ;nonexistent memory ERR= 100000 ;general device error ; ; ; LOCAL DATA ; ; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER) ; PARADR: .BLKW 1 ;PARTITION ADDRESS CNTBL: .BLKW X$$A11 ;ADDRESS OF UNIT CONTROL BLOCK .IF GT X$$A11-1 TEMP: .BLKW 1 ;TEMPORARY STORAGE FOR CONTROLLER NUMBER .ENDC ; ; DRIVER DISPATCH TABLE ; $XATBL:: .WORD XAINI ;DEVICE INITIATOR ENTRY POINT .WORD XACAN ;CANCEL I/O OPERATION ENTRY POINT .WORD XAOUT ;DEVICE TIMEOUT ENTRY POINT .WORD XAPWF ;POWERFAIL ENTRY POINT ;+ ; **-XAINI-** DEVICE INITIATOR ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O 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 THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS ; SUCCESSFUL, THEN THE NEXT I/O OPERATION IS INITIATED. A RETURN TO ; THE 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. ;- .ENABL LSB XAINI: CALL $GTPKT ;GET AN I/O PACKET TO PROCESS BCS XARET ;IF CS CONTROLLER BUSY OR NO REQUEST ; ; 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 OF THE CONTROLLER TO BE INITIATED. ; ; MCA I/O REQUEST PACKET FORMAT: ; ; WD.00 -- I/O QUEUE THREAD WORD. ; WD.01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD.02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK. ; WD.03 -- POINTER TO THE SECOND LUN WORD IN THE REQUESTER TASK ; HEADER. ; WD.04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK ; HEADER (UCB). ; WD.05 -- I/O FUNCTION CODE (IO.WLB, IO.RLB, IO.ATT OR IO.DET). ; WD.06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD.07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD.10 -- I/O STATUS BLOCK ADDRESS ; (REAL OR DISPLACEMENT + 140000). ; WD.11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ;--------------------------------------------------------------------| ; I.PRM| ;--------------------------------------------------------------------| ; WD.12 -- MEMORY EXTENSION BITS OF I/O BUFFER |+ 0| ; WD.13 -- BUFFER ADDRESS OF I/O TRANSFER. |+ 2| ; WD.14 -- NUMBER OF BYTES TO BE TRANSFERED. |+ 4| ; WD.15 -- NOT USED. ; WD.16 -- NOT USED. ; WD.17 -- NOT USED. ; WD.20 -- NOT USED. ; 10$: MOV R5,CNTBL(R3) ;SAVE UCB POINTER FOR INTERRUPT ROUTINE ; ; .IF DF M$$EXT ; ; BIT #DV.EXT,U.CW1(R5) ;Q22 mode ? ; BNE 30$ ;NE=YES ; ; CALL $STMAP ;set up 11/70 mapping register ; ; .ENDC ; 30$: CMPB I.FCN+1(R1),#IO.RLB/256. ;READ LOGICAL BLOCK FUNCTION? BEQ 40$ ;IF EQ YES BR ERROUT ;SOMETHING WRONG ; 40$: MOV S.CSR(R4),R2 ;GET CSR ADDRESS CLR DRVWCR(R2) ;SET WORDCOUNT MOV PARADR,R0 ;GET DMA ADDRESS ASL R0 ;CALC LOWER 16 BITS ASL R0 ASL R0 ASL R0 ASL R0 ASL R0 MOV R0,DRVBAR(R2) ;STORE IN DEVICE CLR R0 MOVB PARADR+1,R0 ;GET UPPER PART OF DMA ADDRESS ASR R0 ;CALCULATE UPPER 6 BITS ASR R0 MOV R0,DRVBAE(R2) ;STORE ADDRESS EXTENSION MOVB #60.,S.CTM(R4) ;SET CURRENT TIMEOUT MOV #,DRVCSR(R2) ;ENABLE DEVICE INTERRUPTS AND GO XARET: RETURN ;+ ; **-XACAN-** CANCEL I/O OPERATION ; ; ENTRY CONDITIONS: ; ; R0=ADDRESS OF ACTIVE I/O PACKET ; R1=ADDRESS OF TCB OF CURRENT TASK ; R3=CONTROLLER INDEX ; R4=SCB ADDRESS ; R5=UCB ADDRESS ; ;- XACAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE XARET ;;;IF NE, NO MOV S.CSR(R4),R3 ;;;GET DEVICE ADDRESS CLR DRVCSR(R3) ;;;SET DEVICE READY CLRB PS ;;;ALLOW INTERRUPTS MOV #IE.ABO&377,R0 ;INDICATE ABORT STATUS BR 70$ ;COMPLETE I/O ;+ ; **-$XAINT-** XA INTERRUPT SERVICE ROUTINE ;- $XAINT:: INTSV$ XA,PR4,X$$A11 ;;;GENERATE INTERRUPT SAVE CODE ; ; R5 NOW CONTAINS UCB POINTER (FROM CNTBL, SEE INTSV$ MACRO IN RSXMC.MAC) ; MOV U.SCB(R5),R4 ;;;GET DEVICE ADDRESS MOV S.CSR(R4),R4 ;;;GET CSR BIC #IE,DRVCSR(R4) ;;;DISABLE DEVICE INTERRUPTS CALL $FORK ;;;CREATE A SYSTEM PROCESS MOV U.SCB(R5),R4 ;GET SCB MOV S.CSR(R4),R3 ;GET CSR BIT #NEX,DRVCSR(R3) ;ERROR BNE ERROUT ;FEHLER BIT #STATA,DRVCSR(R3); START OR END OF DMA ? BEQ 60$ ;STATA CLR: END OF DMA ; ; ELSE BECOME READY TO RECEIVE DATA ; ; BIS #CYCL,DRVCSR(R3);STORE STATION ADDRESS ANND DEV. FUNCTION ; MOV DRVDBR(R3),-(SP) ; CALL $PTBYT MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT TIMEOUT MOV #,DRVCSR(R3) ;INDICATE, WE ARE READY BIS #IE,DRVCSR(R3) ;AUF GEHT'S JMP $INTXT ;RETURN FORM INTERRUPT ; ; END OF DMA ; 60$: MOV #IS.SUC&377,R0 ;SUCCESS BR 70$ ;FINISH ERROUT: MOV #IE.VER&377,R0 ;UNRECOVERABLE HARDWARE ERROR CODE ; 70$: CLR DRVCSR(R3) ;SET DEVICE READY MOV DRVWCR(R3),R1 ;STORE WORD COUNT IN 2ND IO STATUS WORD CALL $IODON ;INITIATE I/O COMPLETION BR XAINI ;BRANCH BACK FOR NEXT REQUEST ; JMP XAINI ;JUMP BACK FOR NEXT REQUEST ;+ ; **-XAOUT-** DEVICE TIMEOUT ; ; TIMEOUTS CAN ONLY OCCUR FOR THE RECEIVER SECTION OF THE CODE. ; ; ENTRY CONDITIONS: ; ; R0=I/O STATUS CODE IE.DNR ; R2=ADDRESS OF DEVICE CSR ; R3=CONTROLLER INDEX ; R4=SCB ADDRESS ; R5=UCB ADDRESS ; ;- XAOUT: CLRB PS ;;;ALLOW INTERRUPTS MOV #T.NDNR,R0 ;GET 'D.N.R.'MESSAGE MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT CALL $DVMSG ;OUTPUT MESSAGE RETURN ;+ ; **-XAPWF-** POWER FAILURE AND DRIVER LOAD ENTRY ; ; ENTRY CONDITIONS: ; ; R3=CONTROLLER INDEX ; R4=SCB ADDRESS ; R5=UCB ADDRESS ; ;- XAPWF: MOV #PARNAM,R3 ;GET PARTITION NAME CALL $SRNAM ;AND LOOK FOR IT BCS 80$ ;BRANCH ON ERROR ; BIT #PS.COM,P.STAT(R2) ;MUST BE A COMMON PARTITION BEQ 80$ ;BRANCH ON ERROR ; MOV P.SIZE(R2),R0 ;GET SIZE OF PARTION (64. BYTES BLOCKS) BEQ 80$ ;BRANCH IF TO SMALL ; MOV P.REL(R2),PARADR ;STORE PARTITION ADDRESS RETURN 80$: ;ERROR ENTRY MOV #T.NDNR,R0 ;GET - DEVICE NOT READY - MESSAGE CALL $DVMSG ;PRINT IT RETURN .DSABL LSB .END