Google
 

Trailing-Edge - PDP-10 Archives - BB-P363B-SM_1985 - mcb/cex/cexslt.m11
There are no other files named cexslt.m11 in the archive.
	.TITLE	CEXSLT - Comm/Exec Support for System Lines
	.IDENT	/003030/
	.ENABL	LC

;
;                    COPYRIGHT (c) 1980, 1981, 1982
;                    DIGITAL EQUIPMENT CORPORATION
;                        Maynard, Massachusetts
;
;     This software is furnished under a license and may  be  used
;     and copied only in accordance with the terms of such license
;     and with the inclusion of the above copyright notice.   This
;     software  or any other copies thereof may not be provided or
;     otherwise made available to any other person.  No  title  to
;     and ownership of the software is hereby transferred.
;
;     The information  in  this  software  is  subject  to  change
;     without  notice  and should not be construed as a commitment
;     by DIGITAL EQUIPMENT CORPORATION.
;
;     DIGITAL assumes no responsibility for the use or reliability
;     of  its  software  on  equipment  which  is  not supplied by
;     DIGITAL.
;

;++
; FACILITY: MCB Communications Executive
;
; FUNCTIONAL ABSTRACT:
;
;	This module contains the routines to support
;	the DLC and DDM interfaces.
;
; ENVIRONMENT: RSX kernel mode with EIS
;
; AUTHOR: Alan D. Peckham, CREATION DATE: 22-Jan-81
;
; MODIFIED BY:
;
;	Alan D. Peckham, 30-Jan-80: VERSION 3.2
; 01	- Merged CEXDLC and CEXDDM modules.
;	  Support expanded C.SRC and C.DST in CCBSC.
; 02	- Support .CRDSP during process context switch.
; 03	- Correct conditionalized D$$BUG code in $DLCDB and $DDMDB.
;--
	.SBTTL	DECLARATIONS

;
; INCLUDE FILES:
;

	.MCALL	CRSH$S

;
; MACROS:
;

	.MACRO	SLCHK$
	.IF	NE,D$$BUG
	CALL	CCBSL
	.ENDC
	.ENDM	SLCHK$

;
; EQUATED SYMBOLS:
;
;	None
;
; OWN STORAGE:
;

	.GLOBL	.SLTNM		; Number of system lines.
	.GLOBL	.SLTTA		; System line table address

	.IIF	NE,<Z.DAT-4>,.ERROR Z.DAT; must be third word in PD
	.IIF	NE,<Z.PIX-4-Z.DAT>,.ERROR Z.PIX; must follow Z.DAT words
	.SBTTL	$DDAST - Send Asynchronous Notification
;++
; FUNCTIONAL DESCRIPTION:
;
;	This routine attempts to allocate a CCB for the DDM and queue
;	it to the DLC with an asynchronous status notification.
;
;	If the CCB allocation fails, the call returns with a failure
;	indication.
;
;	The following information will be inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.AST
;	    C.STS	given asynchronous status code
;	    C.LIX	given line index
;
; CALLING SEQUENCE:
;
;	CALL	$DDAST
;
; INPUT PARAMETERS:
;
;	R3 = Asynchronous completion status.
;	R2 = line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	C-bit set = Resource allocation failure.
;	C-bit clear = Operation successful.
;
; SIDE EFFECTS:
;
;	The routine $CCBGT is called.
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDAST::PLVL$			; Crash if not at process level.
	CALL	$CCBGT		; Try to get a CCB
	BCS	90$		; and if successful
	MOVB	R2,C.LIX(R4)	; then set line index
	CLRB	C.MOD(R4)	; and no function modifier.
	JSR	R5,DDMSS	; Queue with status,
	.BYTE	FC.AST,0	; AST function and new CCB owner.

90$:	RETURN			; Return in shame.
	.SBTTL	$DDCCP - Control Complete
;++
; FUNCTIONAL DESCRIPTION:
;
;	Return the given control CCB to the DLC with an
;	operation status.
;
;	The following information will be inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.CCP
;	    C.STS	given control status code
;
; CALLING SEQUENCE:
;
;	CALL	$DDCCP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;	R3 = Operation completion status.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDCCP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSS	; Queue with status
	.BYTE	FC.CCP,0	; and CCP function.
	.SBTTL	$DDCRA - Kill Receives
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DDM with a request to kill
;	all outstanding receives.
;
;	The following information will be inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.KIL
;	    C.MOD	FM.CRA
;
; CALLING SEQUENCE:
;
;	CALL	$DDCRA
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDCRA::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.KIL,FM.CRA	; KIL function and CRA modifier.
	.SBTTL	$DDGET - Get Characteristics
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DDM with a request to
;	get the characteristics of the line.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.GET
;
; CALLING SEQUENCE:
;
;	CALL	$DDGET
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDGET::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.CTL,FM.GET	; CTL function and GET modifier.
	.SBTTL	$DDKCP - Kill Complete
;++
; FUNCTIONAL DESCRIPTION:
;
;	Return the given ccb to the DLC with an operation status.
;
;	The following information is inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.KCP
;	    C.STS	given kill status code
;
; CALLING SEQUENCE:
;
;	CALL	$DDKCP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;	R3 = Operation completion status.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDKCP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSS	; Queue with status
	.BYTE	FC.KCP,0	; and KCP function.
	.SBTTL	$DDKIL - Kill Receives and Transmits
;++
; FUNCTIONAL DESCRIPTION:
;
;	The call passes a CCB to the DDM with a request to kill
;	all outstanding transmits and receives.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.KIL
;	    C.MOD	FM.KIL
;
; CALLING SEQUENCE:
;
;	CALL	$DDKIL
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDKIL::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.KIL,FM.KIL	; KIL function and KIL modifier.
	.SBTTL	$DDMDB - Get DDM Data Base
;++
; FUNCTIONAL DESCRIPTION:
;
;	Get access to the DDM data base for a system line.
;
;	This call can only be made from the DDM owning the line.
;
; CALLING SEQUENCE:
;
;	CALL	$DDMDB
;
; INPUT PARAMETERS:
;
;	R5 = line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	R5 = address of the DDM data base.
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DDMDB::PLVL$			; Crash if not at process level.
	PUSH$S	R1
	MOV	R5,R1
	DEC	R1		; If line index

	.IF	NE,D$$BUG
	CMP	.SLTNM,R1	; is out of range
	BLO	100$		; then crash.
	.IFTF

	MUL	#L.LEN,R1
	ADD	.SLTTA,R1
	MOVB	L.DDM(R1),R1
	ASL	R1
	MOV	.PDBVB(R1),R1

	.IFT
	CMP	@.CRPDB,(R1)	; If not owning code
	BNE	101$		; then crash,
	.IFTF

	MOV	.CRPDB,R5	; otherwise
	TST	(R5)+
	MOV	.CRDSP,(R5)+	; save old context.
	MOV	.CRDAT+0,(R5)+
	MOV	.CRDAT+2,(R5)
	MOV	R1,.CRPDB	; Set new process
	TST	(R1)+		; and pick up
	MOV	(R1)+,.CRDSP	; dispatch address,
	MAP$	(R1)
	MOV	(R1)+,.CRDAT+0	; bias,
	MOV	(R1),R5
	MOV	(R1)+,.CRDAT+2	; address,
	MOVB	(R1),.CRPIX	; and index.
	POP$S	R1
	RETURN

	.IFT
100$:	POP$S	R1
	CRSH$S	LIX		; Invalid line index
101$:	POP$S	R1
	CRSH$S	DDO		; DDM data base being accessed by stranger
	.ENDC
	.SBTTL	$DDRCE - Receive Enable
;++
; FUNCTIONAL DESCRIPTION:
;
;	This routine is used to return CCB/buffers to the DDM
;	after the DLC no longer needs them.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.RCE
;	    C.MOD	FM.DAT
;
; CALLING SEQUENCE:
;
;	CALL	$DDRCE
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDRCE::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.RCE,FM.DAT	; RCE function and DAT modifier.
	.SBTTL	$DDRCP - Receive Complete
;++
; FUNCTIONAL DESCRIPTION:
;
;	Pass the given receive RDB to the DLC with an
;	operation status.
;
;	The following information is inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.RCP
;	    C.STS	given receive status code
;
; CALLING SEQUENCE:
;
;	CALL	$DDRCP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;	R3 = Operation completion status.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDRCP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSS	; Queue with status
	.BYTE	FC.RCP,0	; and RCP function.
	.SBTTL	$DDSET - Set Characteristics
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DDM with a request to set the
;	charactersistics of the line.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.SET
;
; CALLING SEQUENCE:
;
;	CALL	$DDSET
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDSET::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.CTL,FM.SET	; CTL function and SET modifier.
	.SBTTL	$DDSTP - Stop Line
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DDM with a request to stop
;	the specified line.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.STP
;
; CALLING SEQUENCE:
;
;	CALL	$DDSTP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDSTP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.CTL,FM.STP	; CTL function and STP modifier.
	.SBTTL	$DDSTR - Start Line
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DDM with a request to start
;	the specified line.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.STR
;
; CALLING SEQUENCE:
;
;	CALL	$DDSTR
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDSTR::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.CTL,FM.STR	; CTL function and STR modifier.
	.SBTTL	$DDXCP - Transmit Complete
;++
; FUNCTIONAL DESCRIPTION:
;
;	Return the given transmit CCB/buffer chain to the DLC
;	with an operation status.
;
;	The following information is inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.XCP
;	    C.STS	given transmit status code
;
; CALLING SEQUENCE:
;
;	CALL	$DDXCP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;	R3 = Operation completion status.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDXCP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSS	; Queue with status
	.BYTE	FC.XCP,0	; and XCP function.
	.SBTTL	$DDXKL - Kill Transmits
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DDM with a request to kill
;	all outstanding transmits.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.KIL
;	    C.MOD	FM.XKL
;
; CALLING SEQUENCE:
;
;	CALL	$DDXKL
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDXKL::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSM	; Queue with
	.BYTE	FC.KIL,FM.XKL	; KIL function and XKL modifier.
	.SBTTL	$DDXME - Transmit Enable
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB/buffer chain to the DDM for transmission.
;
;	The following information is inserted into the CCB
;	and may be examined by the DDM:
;	    C.FNC	FC.XME
;
; CALLING SEQUENCE:
;
;	CALL	$DDXME
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DDXME::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DDMSF	; Queue with
	.BYTE	FC.XME,0	; XME function.
	.SBTTL	$DLAST - Send Asynchronous Notification
;++
; FUNCTIONAL DESCRIPTION:
;
;	This routine attempts to allocate a CCB for the DLC and
;	queue it to the LLC with an asynchronous status notification.
;
;	If the CCB allocation fails, the call returns with a failure
;	indication.
;
;	The following information will be inserted into the CCB and
;	may be examined by the LLC:
;	    C.FNC	FC.AST
;	    C.LIX	given line index
;	    C.PIX	0
;	    C.STS	given asynchronous status code
;
; CALLING SEQUENCE:
;
;	CALL	$DLAST
;
; INPUT PARAMETERS:
;
;	R3 = Asynchronous status code.
;	R2 = Line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	C-bit set = Resource allocation failure.
;	C-bit clear = Operation succeeded.
;
; SIDE EFFECTS:
;
;	The routine $CCBGT is called.
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLAST::PLVL$			; Crash if not at process level.
	CALL	$CCBGT		; Try to get a CCB
	BCS	90$		; and if successful
	MOVB	R2,C.LIX(R4)	; then set line index
	CLRB	C.MOD(R4)	; and no function modifier.
	JSR	R5,DLCSS	; Queue with status,
	.BYTE	FC.AST,0	; AST function and new CCB owner.

90$:	RETURN			; Return in shame.
	.SBTTL	$DLCCP - Control Complete
;++
; FUNCTIONAL DESCRIPTION:
;
;	Return the given control CCB to the LLC with an
;	operation status.
;
;	The following information will be inserted into the CCB
;	and may be examined by the LLC:
;	    C.FNC	FC.CCP
;	    C.PIX	0
;	    C.STS	given control status code
;
; CALLING SEQUENCE:
;
;	CALL	$DLCCP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;	R3 = Operation completion status code.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLCCP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSS
	.BYTE	FC.CCP,0
	.SBTTL	$DLCDB - Get DLC Data Base
;++
; FUNCTIONAL DESCRIPTION:
;
;	Get access to the DLC data base for a system line.
;
;	This call can only be made from the DLC owning the line.
;
; CALLING SEQUENCE:
;
;	CALL	$DLCDB
;
; INPUT PARAMETERS:
;
;	R5 = line index.
;
; IMPLICIT INPUTS:
;
;	.CRPIX = process index of current process.
;
; OUTPUT PARAMETERS:
;
;	R5 = address of system line table.
;
; IMPLICIT OUTPUTS:
;
;	KISAR6 = mapped to the system line table.
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DLCDB::PLVL$			; Crash if not at process level.
	PUSH$S	R1
	MOV	R5,R1
	DEC	R1		; If line index

	.IF	NE,D$$BUG
	CMP	.SLTNM,R1	; is out of range
	BLO	100$		; then crash.
	.IFTF

	MUL	#L.LEN,R1
	ADD	.SLTTA,R1
	MOVB	L.DLC(R1),R1
	ASL	R1
	MOV	.PDBVB(R1),R1

	.IFT
	CMP	@.CRPDB,(R1)	; If not owning code
	BNE	101$		; then crash,
	.IFTF


	MOV	.CRPDB,R5	; otherwise
	TST	(R5)+
	MOV	.CRDSP,(R5)+	; save old context.
	MOV	.CRDAT+0,(R5)+
	MOV	.CRDAT+2,(R5)
	MOV	R1,.CRPDB	; Set new process
	TST	(R1)+		; and pick up
	MOV	(R1)+,.CRDSP	; dispatch address,
	MAP$	(R1)
	MOV	(R1)+,.CRDAT+0	; bias,
	MOV	(R1),R5
	MOV	(R1)+,.CRDAT+2	; address,
	MOVB	(R1),.CRPIX	; and index.
	POP$S	R1
	RETURN

	.IFT
100$:	POP$S	R1
	CRSH$S	LIX		; Invalid line index
101$:	POP$S	R1
	CRSH$S	DLO		; DDM data base being accessed by stranger
	.ENDC
	.SBTTL	$DLGET - Get Characteristics
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DLC with a request to get
;	the characteristics of the line.
;
;	The following information will be inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.GET
;
; CALLING SEQUENCE:
;
;	CALL	$DLGET
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLGET::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSM
	.BYTE	FC.CTL,FM.GET
	.SBTTL	$DLRCE - Receive Enable
;++
; FUNCTIONAL DESCRIPTION:
;
;	This routine is used to return CCB/buffers to the DDM
;	after the LLC no longer needs them.
;
;	The following information will be inserted in the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.RCE
;
; CALLING SEQUENCE:
;
;	CALL	$DLRCE
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLRCE::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSF
	.BYTE	FC.RCE,0
	.SBTTL	$DLRCP - Receive Complete
;++
; FUNCTIONAL DESCRIPTION:
;
;	Pass the given chain of CCB/buffers to the LLC with the
;	given operation status.
;
;	The following information will be inserted into the CCB
;	and may be examined by the LLC:
;	    C.FNC	FC.RCP
;	    C.PIX	0
;	    C.STS	given receive status code.
;
; CALLING SEQUENCE:
;
;	CALL	$DLRCP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;	R3 = Operation complete status code.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLRCP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSS
	.BYTE	FC.RCP,0
	.SBTTL	$DLSET - Set Characteristics
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DLC with a request to set
;	the characteristics of the line.
;
;	The following information will be inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.SET
;
; CALLING SEQUENCE:
;
;	CALL	$DLSET
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB conatining:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLSET::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSM
	.BYTE	FC.CTL,FM.SET
	.SBTTL	$DLSTP - Stop Line
;++
; FUNCTIONAL DESCRIPTION:
;
;	This call passes a CCB to the DLC with a request to stop
;	the specified line.
;
;	The following information will be inserted into the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.STP
;
; CALLING SEQUENCE:
;
;	CALL	$DLSTP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLSTP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSM
	.BYTE	FC.CTL,FM.STP
	.SBTTL	$DLSTR - Start Line
;++
; FUNCTIONAL DESCRIPTION:
;
;	The call passes a CCB to the DLC with a request to start
;	the specified line.
;
;	The following information will be inserted in the CCB
;	and may be examined by the DLC:
;	    C.FNC	FC.CTL
;	    C.MOD	FM.STR
;
; CALLING SEQUENCE:
;
;	CALL	$DLSTR
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLSTR::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSM
	.BYTE	FC.CTL,FM.STR
	.SBTTL	$DLXCP - Transmit Complete
;++
; FUNCTIONAL DESCRIPTION:
;
;	Return a given transmit CCB/buffer chain to the LLC
;	with an operation status.
;
;	The following information will be inserted into the CCB
;	and may be examined by the LLC:
;	    C.FNC	FC.XCP
;	    C.PIX	0
;	    C.STS	given transmit status code.
;
; CALLING SEQUENCE:
;
;	CALL	$DLXCP
;
; INPUT PARAMETERS:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;	R3 = Operation completion status code.
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Registers R3 and R4 are not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLXCP::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSS
	.BYTE	FC.XCP,0
	.SBTTL	$DLXME - Transmit Enable
;++
; FUNCTIONAL DESCRIPTION:
;
;	Pass the given CCB/buffer chain to the DLC for transmission.
;
;	The following information will be inserted into the CCB
;	and may examined by the DLC:
;	    C.FNC	FC.XME
;
; CALLING SEQUENCE:
;
;	R4 = Address of CCB chain, the first containing:
;	    C.LIX	line index.
;
; INPUT PARAMETERS:
;
;	None
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	Register R4 is not preserved.
;--

	.PSECT	$CODE$,I,RO
$DLXME::PLVL$			; Crash if not at process level.
	CCBCK$			; Verify CCB address.
	JSR	R5,DLCSF
	.BYTE	FC.XME,0
	.SBTTL	DDMSM - Set Function and Modifier
;++
; FUNCTIONAL DESCRIPTION:
;
;	Set the following information into the given CCB:
;	    C.FNC	function code
;	    C.MOD	function modifier
;	    C.SRC	source process index
;	    C.DST	destination process index
;	    C.OWN	destination process index (FC.AST only)
;
; CALLING SEQUENCE:
;
;	JSR	R5,DDMSM
;	.BYTE	function,modifier
;
; INPUT PARAMETERS:
;
;	R5 = function parameter block:
;	    0(R5)	function code.
;	    1(R5)	function modifier.
;	R4 = address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	On the stack:
;	    0(SP) = original contents of R5.
;	    2(SP) = return address.
;
;	.CRPIX = process index of current process.
;
; OUTPUT PARAMETERS:
;
;	R5 = original contents of R5.
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
DDMSM:	SLCHK$			; Check the line index.
	MOVB	(R5)+,C.FNC(R4)	; Set function,
	MOVB	(R5),C.MOD(R4)	; modifier,
	JSR	R1,CCBSC	; and then do common stuff.
	.WORD	L.DLC-L.LEN
	.SBTTL	DDMSS - Set Function and Status
;++
; FUNCTIONAL DESCRIPTION:
;
;	Set the following information into the given CCB.
;	    C.FNC	function code
;	    C.STS	completion status
;	    C.SRC	source process index
;	    C.DST	destination process index
;	    C.OWN	destination process index (FC.AST only)
;
; CALLING SEQUENCE:
;
;	JSR	R5,DDMSS
;	.BYTE	function,0
;
; INPUT PARAMETERS:
;
;	R5 = function parameter block:
;	    0(R5)	function code.
;	    1(R5)	(unused)
;	R4 = address of CCB containing:
;	    C.LIX	line index.
;	R3 = completion status.
;
; IMPLICIT INPUTS:
;
;	On the stack:
;	    0(SP) = original contents of R5.
;	    2(SP) = return address.
;
;	.CRPIX = process index of current process.
;
; OUTPUT PARAMETERS:
;
;	R5 = original contents of R5.
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
DDMSS:	SLCHK$			; Check the line index.
	MOV	R3,C.STS(R4)	; Set status
	BR	DDMSB		; and go to set function.
	.SBTTL	DDMSF - Set Function
;++
; FUNCTIONAL DESCRIPTION:
;
;	Set the following information into the given CCB.
;	    C.FNC	function code
;	    C.SRC	source process descriptor block
;	    C.DST	destination process descriptor block
;	    C.OWN	destination process index (FC.AST only)
;
; CALLING SEQUENCE:
;
;	JSR	R5,CCBSF
;	.BYTE	function,0
;
; INPUT PARAMETERS:
;
;	R5 = function parameter block:
;	    0(R5)	function code.
;	    1(R5)	(unused)
;	R4 = address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	On the stack:
;	    0(SP) = original contents of R5.
;	    2(SP) = return address.
;
;	.CRPIX = process index of current process.
;
; OUTPUT PARAMETERS:
;
;	R5 = original contents of R5.
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
DDMSF:	SLCHK$			; Check the line index.
DDMSB:	MOVB	(R5)+,C.FNC(R4)	; Set function
	JSR	R1,CCBSC	; and fall through to common stuff.
	.WORD	L.DLC-L.LEN
	.SBTTL	DLCSM - Set Function and Modifier
;++
; FUNCTIONAL DESCRIPTION:
;
;	Set the following information into the given CCB:
;	    C.FNC	function code
;	    C.MOD	function modifier
;	    C.SRC	source process index
;	    C.DST	destination process index
;	    C.OWN	destination process index (FC.AST only)
;
; CALLING SEQUENCE:
;
;	JSR	R5,DLCSM
;	.BYTE	function,modifier
;
; INPUT PARAMETERS:
;
;	R5 = function parameter block:
;	    0(R5)	function code.
;	    1(R5)	function modifier.
;	R4 = address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	On the stack:
;	    0(SP) = original contents of R5.
;	    2(SP) = return address.
;
;	.CRPIX = process index of current process.
;
; OUTPUT PARAMETERS:
;
;	R5 = original contents of R5.
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
DLCSM:	SLCHK$			; Check the line index.
	MOVB	(R5)+,C.FNC(R4)	; Set function,
	MOVB	(R5),C.MOD(R4)	; modifier,
	JSR	R1,CCBSC	; and then do common stuff.
	.WORD	L.LLC-L.LEN
	.SBTTL	DLCSS - Set Function and Status
;++
; FUNCTIONAL DESCRIPTION:
;
;	Set the following information into the given CCB.
;	    C.FNC	function code
;	    C.STS	completion status
;	    C.SRC	source process index
;	    C.DST	destination process index
;	    C.OWN	destination process index (FC.AST only)
;
; CALLING SEQUENCE:
;
;	JSR	R5,DLCSS
;	.BYTE	function,0
;
; INPUT PARAMETERS:
;
;	R5 = function parameter block:
;	    0(R5)	function code.
;	    1(R5)	(unused)
;	R4 = address of CCB containing:
;	    C.LIX	line index.
;	R3 = completion status.
;
; IMPLICIT INPUTS:
;
;	On the stack:
;	    0(SP) = original contents of R5.
;	    2(SP) = return address.
;
;	.CRPIX = process index of current process.
;
; OUTPUT PARAMETERS:
;
;	R5 = original contents of R5.
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
DLCSS:	SLCHK$			; Check the line index.
	MOV	R3,C.STS(R4)	; Set status
	BR	DLCSB		; and go to set function.
	.SBTTL	DLCSF - Set Function
;++
; FUNCTIONAL DESCRIPTION:
;
;	Set the following information into the given CCB.
;	    C.FNC	function code
;	    C.SRC	source process descriptor block
;	    C.DST	destination process descriptor block
;	    C.OWN	destination process index (FC.AST only)
;
; CALLING SEQUENCE:
;
;	JSR	R5,DLCSF
;	.BYTE	function,0
;
; INPUT PARAMETERS:
;
;	R5 = function parameter block:
;	    0(R5)	function code.
;	    1(R5)	(unused)
;	R4 = address of CCB containing:
;	    C.LIX	line index.
;
; IMPLICIT INPUTS:
;
;	On the stack:
;	    0(SP) = original contents of R5.
;	    2(SP) = return address.
;
;	.CRPIX = process index of current process.
;
; OUTPUT PARAMETERS:
;
;	R5 = original contents of R5.
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
DLCSF:	SLCHK$			; Check the line index.
DLCSB:	MOVB	(R5)+,C.FNC(R4)	; Set function
	JSR	R1,CCBSC	; and then do common stuff.
	.WORD	L.LLC-L.LEN

;
; Common code for CCBS* routines.
;

CCBSC:	PUSH$S	(R1)		; Save higher level offset.
	MOV	.CRPDB,C.SRC(R4) ; This is the source process
	CLRB	C.PIX(R4)	; and is from system line.
	MOVB	C.LIX(R4),R1	; Get LIX
	MUL	#L.LEN,R1	; and index into
	ADD	.SLTTA,R1	; system line table
	ADD	(SP)+,R1	; and then into entry.
	MOVB	-(R5),R5	; Get function code
	BEQ	10$		; and if not AST
	CMPB	#FC.TIM,R5	; then check if XCP,RCP,KCP,CCP.
	BLO	20$		; If not,
	MOVB	-2(R1),R5
	ASL	R5
	MOV	.PDBVB(R5),C.DST(R4) ; get lower destination
	CALL	$CCBQL		; and queue to lower process
	BR	30$		; otherwise
10$:	MOVB	(R1),C.OWN(R4)	; set new CCB owner if AST,
20$:	MOVB	(R1),R5
	ASL	R5
	MOV	.PDBVB(R5),C.DST(R4) ; higher destination,
	CALL	$CCBQH		; and queue to higher process.
30$:	POP$S	<R1,R5>		; Recover registers.
	CLC
	RETURN

	.IF	NE,D$$BUG
CCBSL:	TSTB	C.LIX(R4)	; If line index
	BLE	100$		; is
	CMPB	.SLTNM,C.LIX(R4) ; out of range
	BLO	100$		; then crash.
	RETURN

100$:	TST	(SP)+
	POP$S	R5
	CRSH$S	LIX		; Invalid line index
	.ENDC

	.END