Google
 

Trailing-Edge - PDP-10 Archives - BB-P363B-SM_1985 - mcb/cex/ini.b16
There are no other files named ini.b16 in the archive.
module INI (					! DN20 Initialization Process
		ident = 'X03210',
		language (bliss16)
		) =
begin
!
!                    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: DN20 Initialization
!
! ABSTRACT:
!
!	This process sets the load parameters, sends configuration
!	information to relavent processes, and starts the necessary
!	DECnet lines.
!
! ENVIRONMENT: MCB V3.0
!
! AUTHOR: Alan D. Peckham	CREATION DATE: 21-Oct-80
!
! MODIFIED BY:
!
!	Alan Peckham: 21-Oct-80
! 04	- Converted to BLISS.
! 05	- Make sure C_PRM5 state is DS_LIX2 when INILIX is called.
! 06	- Update process header for MCB V3.1
! 07	- Use Network Management interface calls for SC and NSP.
! 08	- Start up all lines at once.
! 10	- Line initialization in INILIX stopped with first unassigned line.
! 11	- Do SET LINE ON to PLP lines.
! 12	- Tell NMX what lines there are.
! 13	- Bug fix - we weren't setting the local node name in SC.
! 14	- (Lee Webber: 10-Jun-81)
!	  Modify to support new DLL/NM interface to TLI:
!	  o  Change "next routine" field in the INI function CCBs from
!	     C_PRM3 to C_PRM5;
!	  o  Add a routine to grant ownership of a circuit to its LLC
!	     before setting it ON;
!	  o  Do a "create circuit" before granting a circuit to the owner;
! 16	- Fix or/and bug in NSP_SET_ADDRESS.
!	  Do not set host number if no host given.
! 17	- do not setup node or host mapping in SC_ADD_NODE if blank
! 18	- Add support for DMR devices in INILIX.
! 19	- Fix INILIX to use new $MCB_GET_DEVICE_NAME for device names.
! 20	- Set proper host node number.
! 21    - (Jerry Weisbach 26-Feb-82) Add support for X.25 Line Entity.
!         o Remove routine DLC_SET_LINE_ON
!         o Add routines LLC_GRANT_LINE_OWNERSHIP and LLC_SET_LINE_ON.
!         o Modify INILIX to pass control start to Line owner.

!--

!
! INCLUDE FILES:
!

library 'MCBLIB';

library 'XPORTX';

library 'NMXLIB';

require 'DLLLIB';

switches list (require);
$SHOW (FIELDS) $SHOW (LITERALS)
require 'INIDAT';
switches list (norequire);


!
! TABLE OF CONTENTS:
!

forward routine
    CRASH_ON_NEGATIVE_STATUS : LINKAGE_DB_CCB,
    GET_NM_CCB,
    INICCP : MCB_DB_CCB_MOD novalue,
    INILIX : LINKAGE_DB_CCB,
    INITIM : MCB_DB_MOD novalue,
    LLC_GRANT_CIRCUIT_OWNERSHIP : LINKAGE_DB_CCB,
    LLC_SET_CIRCUIT_ON : LINKAGE_DB_CCB,
    LLC_GRANT_LINE_OWNERSHIP : LINKAGE_DB_CCB,
    LLC_SET_LINE_ON : LINKAGE_DB_CCB,
    NSP_SET_ADDRESS : LINKAGE_DB_CCB,
    RETURN_NM_CCB : LINKAGE_CCB novalue,
    SC_ADD_NODE : LINKAGE_DB_CCB,
    SC_SET_HOST : LINKAGE_DB_CCB,
    SC_SET_NODE_ON : LINKAGE_DB_CCB,
    XPT_INITIALIZE : LINKAGE_DB_CCB;

!
! MACROS:
!
!	None
!
! EQUATED SYMBOLS:
!

$field
    N_FIELDS =
	set
	N_BYTES = [$BYTE],
	N_STRING = [$BYTES (15)]
	tes;

literal
    N_LENGTH = $FIELD_SET_SIZE;

literal
    DSR_LENGTH = (5 + 4 + N_LENGTH)^1,
    FALSE = 1 eql 0,
    TRUE = 1 eql 1;

global literal
    %name ('D.LEN') = D_LEN^1;

!
! OWN STORAGE:
!

external routine
    $DSPCR : novalue;

$MCB_PROCESS (
    NAME = INI,					! Process name
    LLC_DISPATCH = TABLE$ ($DSPCR, FC_CCP,	! Dispatch vector:
	(FC_CCP, INICCP), 			!  control complete
	(FC_TIM, INITIM)));			!  timeout
!
! EXTERNAL REFERENCES:
!

external
    MCB$GAW_PROCESS_DATA_BASE : vector [2],
    MCB$GW_PROCESS_HANDLE;

bind
    DB = MCB$GAW_PROCESS_DATA_BASE [1] : ref block field (D_FIELDS),
    DB_BIAS = MCB$GAW_PROCESS_DATA_BASE [0];
routine CRASH_ON_NEGATIVE_STATUS (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_FIELDS);

    if .CCB [C_STS] lss 0
    then
	SIGNAL_STOP (INI$_FAILED, .CCB [C_STS], .CCB);

    CCB [C_PRM5] = .CCB [C_PRM4];
    CCB [C_PRM4] = 0;
    FALSE
    end;				!of routine CRASH_ON_NEGATIVE_STATUS
routine GET_NM_CCB (CCB_ADR) =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    local
	CCB : ref block field (C_FIELDS);

    if not $MCB_GET_CCB (CCB) then return FALSE;

    if not $MCB_GET_DSR (DSR_LENGTH, CCB [C_ADDR])
    then
	begin
	$MCB_RETURN_CCB (.CCB);
	return FALSE
	end;

    .CCB_ADR = .CCB;
    TRUE
    end;					!of routine GET_NM_CCB
routine INICCP (DB, CCB, MODF) : MCB_DB_CCB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_FIELDS);

    if .CCB [C_STS] lss 0
    then
	SIGNAL_STOP (INI$_FAILED, .CCB [C_STS], .CCB);

    do 0 until LINKAGE_DB_CCB (.CCB [C_PRM5], .DB, .CCB);

    end;					!of routine INICCP
routine INILIX (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_FIELDS);

    do
	begin
	CCB [C_LIX] = DB [D_LIX] = .DB [D_LIX] + 1;

	if GTPRC$ (.CCB)
	then
	    begin

	    local
		NMX_PIX;

!
!  Construct the circuit ID.
!

	    $MCB_GET_DEVICE_NAME (.CCB[C_LIX], .CCB [C_ADDR]);

!
!  Create the circuit at Network Management
!


	    if not $MCB_GET_PROCESS_HANDLE (%rad50_11'NMX', NMX_PIX)
	    then
		NMX_PIX = 0;


!
!  Dispatch the CCB to the owner process
!

	    if .CCB [C_PRM1] neq 0
	    then
		begin

		local
		    PROCESS;

		if not PDVNM$ (.CCB [C_PRM1], PROCESS)
		then
		    SIGNAL_STOP (INI$_NO_CODE);

		selectone .PROCESS of
		    set
		    [%rad50_11'TLI'] :
			begin
			if .NMX_PIX neq 0
			then
                            NMX$CREATE_CIRCUIT (.NMX_PIX, .CCB[C_ADDR], 0, NMX_PIX);
			CCB [C_PRM5] = LLC_GRANT_CIRCUIT_OWNERSHIP;
			CCB [C_PRM4] = .CCB [C_PRM1];
			CCB [C_PIX] = .MCB$GW_PROCESS_HANDLE;
			CCB [C_FNC] = FC_CCP;
			$MCB_SCHEDULE_CCB (.CCB);
			end;

		    [%rad50_11'PLP'] :
			begin
			if .NMX_PIX neq 0
			then
                            NMX$CREATE_LINE (.NMX_PIX, .CCB[C_ADDR], 0, NMX_PIX);
			CCB [C_PRM5] = LLC_GRANT_LINE_OWNERSHIP;
			CCB [C_PRM4] = .CCB [C_PRM1];
			CCB [C_PIX] = .MCB$GW_PROCESS_HANDLE;
			CCB [C_FNC] = FC_CCP;
			$MCB_SCHEDULE_CCB (.CCB);
			end;

		    [otherwise] :
			RETURN_NM_CCB (.CCB);

		    tes;

		end
	    else
		RETURN_NM_CCB (.CCB)

	    end
	else
	    begin
	    RETURN_NM_CCB (.CCB);
	    return TRUE;
	    end;

	end
    while GET_NM_CCB (CCB);

    FALSE
    end;					!of routine INILIX
routine INITIM (DB, MODF) : MCB_DB_MOD novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    if .MODF eql FM_PIN
    then
	begin

	map
	    DB : ref block field (D_FIELDS);

	local
	    CCB : ref block field (C_FIELDS);

	external
	    $SYSIZ : block [3];

	if .$SYSIZ [2, 0, 16, 1] eql -1 and .$SYSIZ [1, 8, 8, 1] eql -1
	then
	    begin

	    linkage
		COPY_LINKAGE = jsr (register = 2, register = 0, register = 1) : nopreserve (0, 1, 2);

	    routine COPY (FROM_ADR, LNG, TO_ADR) : COPY_LINKAGE NOVALUE =

		if ..FROM_ADR neq 0
		then

		    do ch$wchar_a (ch$rchar_a (FROM_ADR), TO_ADR)
		    while (LNG = .LNG - 1) neq 0;

	    MAP$ (.$SYSIZ [0, 0, 16, 0] - 1);
	    COPY (%o'140000', 2, DB [D_ADR]);
	    COPY (%o'140002', 6, DB [D_NAM]);
	    COPY (%o'140010', 6, DB [D_HST]);
	    COPY (%o'140016', 2, DB [D_HAD]);
	    end;

	if not GET_NM_CCB (CCB) then return SIGNAL_STOP (INI$_NO_CCB);

	CCB [C_PIX] = .MCB$GW_PROCESS_HANDLE;
	CCB [C_FNC] = FC_CCP;
	CCB [C_MOD] = 0;
	CCB [C_BIAS] = 0;
	CCB [C_PRM5] = XPT_INITIALIZE;
	CCB [C_PRM4] = 0;
	$MCB_SCHEDULE_CCB (.CCB);
	end;					!of routine INITIM
routine LLC_GRANT_CIRCUIT_OWNERSHIP (DB, CCB): LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
! Constructs a "Grant Circuit Ownership" CCB and sends it to the
! LLC for the circuit.
!
! FORMAL PARAMETERS
!
!	DB	Address of INI data base.
!
!	CCB	Function CCB to be used:
!
!		CCB[C_LIN]	LIX for the circuit.
!		CCB[C_ADDR]	Address of a block of DSR.
!		CCB[C_PRM2]	Provider (DLC) PIX for the circuit.
!		CCB[C_PRM3]	Characteristics word for circuit
!		CCB[C_PRM4]	Owner (LLC) PIX for the circuit.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_FIELDS);


    CCB [$SUB_FIELD (C_PRM1, DLL$B_PROVIDER_LINE_INDEX)] = .CCB[C_LIX];
    CCB [$SUB_FIELD (C_PRM1, DLL$B_PROVIDER_PROCESS_INDEX)] = .CCB[C_PRM2];
    CCB [C_PRM2] = .CCB[C_ADDR];
    CCB [C_PRM3] = 0;

    if ch$eql (3, uplit (%ascii 'DTE'), 3, ch$plus (.CCB [C_PRM2], 1))
    then
	CCB [$SUB_FIELD (C_PRM3, DLL$V_DTE_CIRCUIT)] = 1;

    CCB [C_PRM5] = LLC_SET_CIRCUIT_ON;
    CCB [C_LIX] = 0;
    CCB [C_PIX] = .CCB[C_PRM4];
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_STR;

    $MCB_SCHEDULE_CCB (.CCB);
    TRUE

    end;				!End of LLC_GRANT_CIRCUIT_OWNERSHIP
routine LLC_SET_CIRCUIT_ON (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
! Constructs a "Set Circuit State ON" CCB and sends it to the circuit's
! owner.
!
! FORMAL PARAMETERS:
!	
!	DB	Address of the INI data base.
!
!	CCB	Function CCB:
!
!		CCB[C_LIN]	L.O. byte of the EID for the circuit (the
!				H.O. byte will be the owner PIX).
!		CCB[C_ADDR]	Pointer to some DSR.
!		CCB[C_PRM1]	Provider (DLC) PIX for the circuit.
!		CCB[C_PRM4]	Owner (LLC) PIX for the circuit.
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_NM_FIELDS);

    CCB [C_PIX] = .CCB [C_PRM4];
    CCB [C_PRM5] = INILIX;
    CCB [C_NM_FUNC] = NMX$FNC_SET;
    CCB [C_NM_ENTITY] = NMX$ENT_CKT;
    begin

    literal
	PARAM_NUMBER = 0;

    local
	PTR;

    PTR = .CCB [C_ADDR];
    ch$wchar_a (PARAM_NUMBER and %o'377', PTR);
    ch$wchar_a (PARAM_NUMBER^-8 and %o'377', PTR);
    ch$wchar_a (0, PTR);
    CCB [C_CNT] = PTR = ch$diff (.PTR, .CCB [C_ADDR]);
    end;
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_NM;
    $MCB_SCHEDULE_CCB (.CCB);
    TRUE
    end;					!of routine LLC_SET_CIRCUIT_ON
routine LLC_GRANT_LINE_OWNERSHIP (DB, CCB): LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
! Constructs a "Grant Line Ownership" CCB and sends it to the
! LLC for the line.
!
! FORMAL PARAMETERS
!
!	DB	Address of INI data base.
!
!	CCB	Function CCB to be used:
!
!		CCB[C_LIN]	LIX for the line.
!		CCB[C_ADDR]	Address of a block of DSR.
!		CCB[C_PRM2]	Provider (DLC) PIX for the line.
!		CCB[C_PRM3]	Characteristics word for line
!		CCB[C_PRM4]	Owner (LLC) PIX for the line.
!
! IMPLICIT INPUTS
!
!	NONE.
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE.
!
! SIDE EFFECTS:
!
!	NONE.
!
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_FIELDS);


    CCB [$SUB_FIELD (C_PRM1, DLL$B_PROVIDER_LINE_INDEX)] = .CCB[C_LIX];
    CCB [$SUB_FIELD (C_PRM1, DLL$B_PROVIDER_PROCESS_INDEX)] = .CCB[C_PRM2];
    CCB [C_PRM2] = .CCB[C_ADDR];
    CCB [C_PRM3] = 0;

    CCB [C_PRM5] = LLC_SET_LINE_ON;
    CCB [C_LIX] = 0;
    CCB [C_PIX] = .CCB[C_PRM4];
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_STR;

    $MCB_SCHEDULE_CCB (.CCB);
    TRUE

    end;				!End of LLC_GRANT_LINE_OWNERSHIP
routine LLC_SET_LINE_ON (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
! Constructs a "Set Line State ON" CCB and sends it to the line's
! owner.
!
! FORMAL PARAMETERS:
!	
!	DB	Address of the INI data base.
!
!	CCB	Function CCB:
!
!		CCB[C_LIN]	L.O. byte of the EID for the line (the
!				H.O. byte will be the owner PIX).
!		CCB[C_ADDR]	Pointer to some DSR.
!		CCB[C_PRM1]	Provider (DLC) PIX for the line.
!		CCB[C_PRM4]	Owner (LLC) PIX for the line.
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_NM_FIELDS);

    CCB [C_PIX] = .CCB [C_PRM4];
    CCB [C_PRM5] = INILIX;
    CCB [C_NM_FUNC] = NMX$FNC_SET;
    CCB [C_NM_ENTITY] = NMX$ENT_LIN;
    begin

    literal
	PARAM_NUMBER = 0;

    local
	PTR;

    PTR = .CCB [C_ADDR];
    ch$wchar_a (PARAM_NUMBER and %o'377', PTR);
    ch$wchar_a (PARAM_NUMBER^-8 and %o'377', PTR);
    ch$wchar_a (0, PTR);
    CCB [C_CNT] = PTR = ch$diff (.PTR, .CCB [C_ADDR]);
    end;
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_NM;
    $MCB_SCHEDULE_CCB (.CCB);
    TRUE
    end;					!of routine LLC_SET_LINE_ON
routine NSP_SET_ADDRESS (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_NM_FIELDS);

    if not $MCB_GET_PROCESS_HANDLE (%rad50_11 'NSP', CCB [C_PIX])
    then
	begin
	CCB [C_PRM5] = INILIX;
	return FALSE
	end;

    CCB [C_PRM4] = SC_SET_HOST;
    CCB [C_PRM5] = CRASH_ON_NEGATIVE_STATUS;
    CCB [C_NM_FUNC] = NMX$FNC_SET;
    CCB [C_NM_ENTITY] = NMX$ENT_NOD;
    begin

    literal
	LOCAL_PARAM_NUMBER = 502;

    local
	PTR;

    PTR = .CCB [C_ADDR];
    ch$wchar_a (LOCAL_PARAM_NUMBER and %o'377', PTR);
    ch$wchar_a (LOCAL_PARAM_NUMBER^-8 and %o'377', PTR);
    ch$wchar_a (.DB [$SUB_FIELD (D_ADR, 0, 0, 8, 0)], PTR);
    ch$wchar_a (.DB [$SUB_FIELD (D_ADR, 0, 8, 8, 0)], PTR);
    ch$wchar_a (0, PTR);
    CCB [C_CNT] = PTR = ch$diff (.PTR, .CCB [C_ADDR]);
    end;
    begin

    bind
	NMPAR = vector [.CCB [C_ADDR], 5] : vector [4];

    local
	PTR;

    CCB [C_PRM2] = NMPAR;
    NMPAR [0] = 0;
    NMPAR [1] = 0;
    PTR = ch$ptr (NMPAR [2],, 8);
    ch$wchar_a (.DB [$SUB_FIELD (D_ADR, 0, 0, 8, 0)], PTR);
    ch$wchar_a (.DB [$SUB_FIELD (D_ADR, 0, 8, 8, 0)], PTR);
    ch$wchar_a (0, PTR);
    end;
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_NM;
    $MCB_SCHEDULE_CCB (.CCB);
    TRUE
    end;					!of routine NSP_SET_ADDRESS
routine RETURN_NM_CCB (CCB) : LINKAGE_CCB novalue =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	CCB : ref block field (C_FIELDS);

    $MCB_RETURN_DSR (DSR_LENGTH, .CCB [C_ADDR]);
    CCBRT$ (.CCB);
    end;					!of routine RETURN_NM_CCB
routine SC_ADD_NODE (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    local
	NODE_ADDR,
	NODE_PTR;

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_NM_FIELDS);

    if not $MCB_GET_PROCESS_HANDLE (%rad50_11 'SC', CCB [C_PIX])
    then
	begin
	CCB [C_PRM5] = INILIX;
	return FALSE
	end;

    selectone .CCB [C_PRM3]  of
    set

    [0]:	begin
	CCB [C_PRM3] = .CCB [C_PRM3] + 1;
	CCB [C_PRM4] = SC_ADD_NODE;
	NODE_ADDR = .DB [D_ADR];
	NODE_PTR = byt$ptr (DB [D_NAM]);
		end;
    [1]:	begin
	CCB [C_PRM4] = SC_SET_NODE_ON;
	NODE_PTR = byt$ptr (DB [D_HST]);
	NODE_ADDR = .DB [D_HAD];
		end;
    tes;
    CCB [C_PRM5] = CRASH_ON_NEGATIVE_STATUS;

    if .NODE_ADDR eql 0 then return FALSE;

    if ch$rchar (.NODE_PTR) eql %c' ' then return FALSE;

    CCB [C_NM_FUNC] = NMX$FNC_SET;
    CCB [C_NM_ENTITY] = NMX$ENT_NOD;
    begin

    literal
	PARAM_NUMBER = 500;

    local
	LEN,
	PTR;

    PTR = .CCB [C_ADDR];
    ch$wchar_a (PARAM_NUMBER and %o'377', PTR);
    ch$wchar_a (PARAM_NUMBER^-8 and %o'377', PTR);
    LEN = ch$find_ch (6, .NODE_PTR, %c' ');
    if ch$fail (.LEN) then
	LEN = 6
    else LEN = ch$diff (.LEN, .NODE_PTR);
    ch$wchar_a (.LEN, PTR);
    PTR = ch$move (.LEN, .NODE_PTR, .PTR);
    CCB [C_CNT] = PTR = ch$diff (.PTR, .CCB [C_ADDR]);
    end;
    begin

    bind
	NMPAR = vector [.CCB [C_ADDR], 5] : vector [4];

    local
	PTR;

    CCB [C_PRM2] = NMPAR;
    NMPAR [0] = 0;
    NMPAR [1] = 0;
    PTR = ch$ptr (NMPAR [2],, 8);
    ch$wchar_a (.NODE_ADDR<0, 8, 0>, PTR);
    ch$wchar_a (.NODE_ADDR<8, 8, 0>, PTR);
    ch$wchar_a (0, PTR);
    end;
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_NM;
    $MCB_SCHEDULE_CCB (.CCB);
    TRUE
    end;					!of routine SC_ADD_NODE
routine SC_SET_HOST (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_NM_FIELDS);

    if not $MCB_GET_PROCESS_HANDLE (%rad50_11 'SC', CCB[C_PIX])
    then
	begin
	CCB [C_PRM5] = INILIX;
	return FALSE
	end;

    CCB [C_PRM3] = 0;
    CCB [C_PRM4] = SC_ADD_NODE;
    CCB [C_PRM5] = CRASH_ON_NEGATIVE_STATUS;

    if .DB [D_HAD] eql 0 then return FALSE;

    CCB [C_NM_FUNC] = NMX$FNC_SET;
    CCB [C_NM_ENTITY] = NMX$ENT_NOD;
    begin

    literal
	HOST_PARAM_NUMBER = 141;

    local
	PTR;

    PTR = .CCB [C_ADDR];
    ch$wchar_a (HOST_PARAM_NUMBER and %o'377', PTR);
    ch$wchar_a (HOST_PARAM_NUMBER^-8 and %o'377', PTR);
    ch$wchar_a (.DB [$SUB_FIELD (D_HAD, 0, 0, 8, 0)], PTR);
    ch$wchar_a (.DB [$SUB_FIELD (D_HAD, 0, 8, 8, 0)], PTR);
    ch$wchar_a (0, PTR);
    CCB [C_CNT] = PTR = ch$diff (.PTR, .CCB [C_ADDR]);
    end;
    begin

    bind
	NMPAR = vector [.CCB [C_ADDR], 5] : vector [4];

    local
	PTR;

    CCB [C_PRM2] = NMPAR;
    NMPAR [0] = 0;
    NMPAR [1] = 0;
    PTR = ch$ptr (NMPAR [2],, 8);
    ch$wchar_a (.DB [$SUB_FIELD (D_HAD, 0, 0, 8, 0)], PTR);
    ch$wchar_a (.DB [$SUB_FIELD (D_HAD, 0, 8, 8, 0)], PTR);
    ch$wchar_a (0, PTR);
    end;
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_NM;
    $MCB_SCHEDULE_CCB (.CCB);
    TRUE
    end;					!of routine SC_SET_HOST
routine SC_SET_NODE_ON (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_NM_FIELDS);

    if not $MCB_GET_PROCESS_HANDLE (%rad50_11 'SC', CCB [C_PIX])
    then
	begin
	CCB [C_PRM5] = INILIX;
	return FALSE
	end;

    CCB [C_PRM4] = INILIX;
    CCB [C_PRM5] = CRASH_ON_NEGATIVE_STATUS;
    CCB [C_NM_FUNC] = NMX$FNC_SET;
    CCB [C_NM_ENTITY] = NMX$ENT_NOD;
    begin

    literal
	PARAM_NUMBER = 0;

    local
	PTR;

    PTR = .CCB [C_ADDR];
    ch$wchar_a (PARAM_NUMBER and %o'377', PTR);
    ch$wchar_a (PARAM_NUMBER^-8 and %o'377', PTR);
    ch$wchar_a (0, PTR);
    CCB [C_CNT] = PTR = ch$diff (.PTR, .CCB [C_ADDR]);
    end;
    begin

    bind
	NMPAR = vector [.CCB [C_ADDR], 5] : vector [4];

    local
	PTR;

    CCB [C_PRM2] = NMPAR;
    NMPAR [0] = 0;
    NMPAR [1] = 0;
    PTR = ch$ptr (NMPAR [2],, 8);
    ch$wchar_a (.DB [$SUB_FIELD (D_ADR, 0, 0, 8, 0)], PTR);
    ch$wchar_a (.DB [$SUB_FIELD (D_ADR, 0, 8, 8, 0)], PTR);
    ch$wchar_a (0, PTR);
    end;
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = FM_NM;
    $MCB_SCHEDULE_CCB (.CCB);
    TRUE
    end;					!of routine SC_SET_NODE_ON
routine XPT_INITIALIZE (DB, CCB) : LINKAGE_DB_CCB =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!	None
!
! IMPLICIT INPUTS:
!	None
!
! IMPLICIT OUTPUTS:
!	None
!
! ROUTINE VALUE:
! COMPLETION CODES:
!	None
!
! SIDE EFFECTS:
!	None
!--

    begin

    map
	DB : ref block field (D_FIELDS),
	CCB : ref block field (C_FIELDS);

    if not $MCB_GET_PROCESS_HANDLE (%rad50_11 'XPT', CCB [C_PIX])
    then
	begin
	CCB [C_PRM5] = INILIX;
	return FALSE
	end;

    CCB [C_PRM3] = 0;
    CCB [C_PRM4] = NSP_SET_ADDRESS;
    CCB [C_PRM5] = CRASH_ON_NEGATIVE_STATUS;
    CCB [C_PRM1] = .DB [D_ADR];
    CCB [C_FNC] = FC_CTL;
    CCB [C_MOD] = 0;
    $MCB_SCHEDULE_CCB (.CCB);
    TRUE
    end;					!of routine XPT_INITIALIZE
end
eludom