.TITLE DDBMAC .SBTTL Driver Data Base Build MACROs .IDENT /010986/ .ENABL LC ; ;+ ;***** ; ; DDBMAC.MAC - Defines a set of MACROS for building driver ; data bases; DCB,UCB,SCB. Adopted from KXDRV specifically ; for RSX11M and drivers supported in the PRSLMU system. ; ; Prior to invoking the MACROs, the following symbols should ; be defined: ; ; LD$"DEV" = Defined for loadable driver ; "DEV"TMO = Initial device timeout count (in secs) ; "DEV"PRI = Hardware interrupt priority of device ; (use "PR0"-"PR7" from HWDDF$) ; "DEV"0CSR = Unit 0's CSR address ; "DEV"0VEC = Unit 0's interrupt vector address ; ; where "DEV" is the 2 character device name, eg. TT,DY, etc. ; For multi-controller drivers, each unit associated with ; an SCB must have it's CSR address and vector defined by symbols ; of the form: ; ; "DEV""N"CSR = Unit N's CSR address ; "DEV""N"VEC = Unit N's interrupt vector address ; ; where "DEV" is the 2 character device name and "N" is the ; physical unit number of the device. ; ; Use of MACROS is intentionally separated, ie. DCB$ does ; not invoke UCB$ or SCB$, so that patches ; to the device data base structures may be made. ; Symbols for each control block use the DEC standard convention: ; ; $"DEV"DAT = DCB start address ; ."DEV""N" = UCB start address ; $"DEV""N" = SCB Start address ; ; Patching may be done by setting the current location pointer to ; the start address + symbolic offset to datum to be re-defined ; and then performing the appropriate redefinition. For example, ; to flag a device as an NPR device, patch each UCB using: ; ; UCB$ XA,0 ; define XA0: UCB ; $$$=. ; remember current position ; .=.XA0+U.CTL ; re-position location counter ; .byte UC.NPR!UC.PWF ; re-define control flags ; .=$$$ ; recover current location ; UCB$ XA,1 ; define next UCB ; ; *** ; ; DCB$DF DEV,N -- Defines Driver DCB for device name "DEV", with ; "N" physical units ; ; *** ; ; UCB$DF DEV,N,EXT -- Defines Driver UCB for device "DEV" unit # "N" ; with "EXT" word extension after ; *** ; ; SCB$DF DEV,N -- Defines Driver SCB for device "DEV" unit # "N" ; ;***** ; ; Paul Sorenson ; AEP/Operations Control ; Columbus, OH 43216 ;***** ;- ; ; ; ; *** DCB$DF -- DEV is the device name, N is the number of physical units ; .MACRO DCB$DF DEV,NUM $'DEV'DAT:: ;GLOBAL LABEL FOR LOADABLE DRIVERS .WORD 0 ;GLOBAL LINK TO NEXT DCB (D.LNK) .WORD .'DEV'0 ;POINTER TO FIRST UCB (D.UCB) .ASCII /'DEV'/ ;DEVICE NAME (D.NAM) .BYTE 0 ;LOWEST UNIT # FOR DCB (D.UNIT) .BYTE NUM-1 ;HIGHEST UNIT # (D.UNIT+1) .WORD 'DEV'ND-'DEV'ST ;UCB SIZE (D.UCBL) .IF DF LD$'DEV' .WORD 0 ;DISPATCH TABLE ADDRESS (D.DSP) .IFF .WORD $'DEV'TBL .ENDC .WORD 160037 ;LEGAL FUNCTION MASK 1.-16. (D.MSK) ; IO.KIL/IO.WLB/IO.RLB/IO.ATT/IO.DET .WORD 31 ;CONTROL FUNCTION MASK 1.-16. ; IO.KIL/IO.ATT/IO.DET .WORD 160000 ;NO-OP FUNCTION MASK 1.-16. ; IO.ACR/IO.ACW/IO.ACE .WORD 0 ;ACP FUNCTION MASK 1.-16. .WORD 7 ;LEGAL FUNCTION MASK 17.-32. ; IO.DAC/IO.RVB/IO.WVB .WORD 0 ;CONTROL FUNCTION MASK 17.-32. .WORD 1 ;NO-OP FUNCTION MASK 17.-32. ; IO.DAC .WORD 6 ;ACP FUNCTION MASK 17.-32. ; IO.RVB/IO.WVB .IF DF L$$DRV .WORD 0 ;ADDRESS OF DRIVER PCB (D.PCM) .ENDC .ENDM ; ; ; *** UCB$ -- DEV is the device name, N is the controller number, EXT is the ; UCB extension size in words ; .MACRO UCB$DF DEV,N,EXT 'DEV'ST=. .IF DF M$$MUP .WORD 0 ;UCB ADDRESS OF OWNER TERMINAL (U.OWN) .ENDC .'DEV''N: .WORD $'DEV'DAT ;DCB POINTER (U.DCB) .WORD .-2 ;REDIRECT POINTER (U.RED) .BYTE UC.PWF ;CONTROL FUNCTION MASK (U.CTL) .BYTE 0 ;DEVICE INDEPENDENT STATUS (U.STS) .BYTE N ;PHYSICAL UNIT NUMBER (U.UNIT) .BYTE 0 ;ADDITIONAL STATUS (U.ST2) .WORD DV.REC ;DEVICE CHARACTERISTICS (U.CW1) .WORD 0 ; (U.CW2) .WORD 0 ; (U.CW3) .WORD 512. ;DEFAULT BUFFER SIZE (U.CW4) .WORD $'DEV''N ;SCB ADDRESS (U.SCB) .WORD 0 ;TCB ADDRESS OF ATTACHED TASK (U.ATT) .WORD 0,0 ;BUFFER ADDRESS DOUBLE WORD (U.BUF) .WORD 0 ;TRANSFER COUNT (U.CNT) ; ; DEVICE DEPENDENT ; .IF NB EXT .BLKW EXT ;ADD "EXT" WORD UCB EXTENSION .ENDC ;EXT 'DEV'ND=. ; MARK END OF UCB FOR SIZE IN DCB .ENDM ;UCB$DF ; ; ; *** SCB$ -- DEV is the device name, N is the controller number ; .MACRO SCB$DF DEV,N .IF DF R$$MPL ; FOR RSX-11M+ .BYTE 'DEV'PRI,'DEV''N'VEC/4 ;PRIORITY & INTERRUPT VECTOR .BYTE 'N'*2,0 ;CONTROLLER INDEX, STATUS .WORD KS.OFL ;CONTROLLER STATUS .KRBL 'DEV',\N ;START OF KRB .KRB=. .WORD 'DEV''N'CSR ;CSR ADDRESS .WORD .UCT-.KRB ;OFFSET TO UCB TABLE .BYTE 0,0 ;HIGHEST PHYSICAL UNIT, UNUSED .WORD .'DEV''N ;OWNER $'DEV''N: .WORD 0,.-2 ;I/O QUEUE LISTHEAD .WORD 0 ;FORK BLOCK .WORD 0 ; " " .WORD 0 ; " " .WORD 0 ; " " .WORD 0 ;DRIVER KISAR5 .WORD 0 ;I/O PACKET ADDRESS .BYTE 0,'DEV'TMO ;CURRENT AND INITIAL TIMEOUT .BYTE 0,0 ;STATUS, STATUS EXTENSION .WORD S2.CON ;STATUS EXTENSION .KRBA 'DEV',\N ;KRB ADDRESS .UCT=. .IFF ; FOR RSX11M .IF NDF LD$'DEV' .ASECT .='DEV''N'VEC ;DEFINE RESIDENT DRIVER VECTOR .WORD $'DEV'INT ;INTERRUPT ENTRY POINT .WORD PR7+ .PSECT .ENDC $'DEV''N': .WORD 0 ;I/O QUEUE LISTHEAD (S.LHD) .WORD $'DEV''N' ;POINTER TO FIRST WORD (S.LHD+2) .BYTE 'DEV'PRI ;DEVICE PRIORITY (S.PRI) .BYTE 'DEV''N'VEC/4 ;INTERRUPT VECTOR (S.VEC) .BYTE 0 ;CURRENT TIMEOUT COUNT (S.CTM) .BYTE 'DEV'TMO ;INITIAL TIMEOUT COUNT (S.ITM) .BYTE 'N'*2 ;CONTROLLER INDEX (S.CON) .BYTE 0 ;CONTROLLER STATUS (S.STS) .WORD 'DEV''N'CSR ;CSR ADDRESS (S.CSR) .WORD 0 ;PACKET ADDRESS (S.PKT) .WORD 0 ;FORK BLOCK (S.FRK) .WORD 0 ; " " .WORD 0 ; " " .WORD 0 ; " " .IF DF L$$DRV&M$$MGE .WORD 0 ;RELOCATION BIAS OF DRIVER PARTITION .ENDC .ENDC ; .IF DF LD$'DEV' $'DEV'END==. .ENDC .ENDM ;SCB$DF