Google
 

Trailing-Edge - PDP-10 Archives - BB-P363B-SM_1985 - mcb/cex/cexnmx.m11
There are no other files named cexnmx.m11 in the archive.
	.TITLE	CEXNMX	- Network Management Service Routines
	.IDENT	/003060/
	.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
;
; ABSTRACT:
;	This module contains routines to service Network Management
;	common functions to save space in individual processes.
;	
; ENVIRONMENT:
;	 RSX kernel mode with EIS
;	
; AUTHOR: Alan D. Peckham CREATION DATE:  19-Sep-81
;
; MODIFIED BY:
;
;	Alan D. Peckham, 19-Sep-81: VERSION 1.0
; 01	- New module.
; 02	- Fixes too numerable to mention.
; 03	- Account for length byte in logging buffer in $NLBEG and $NLEND.
; 04	- Add O-2 parameter.
; 05	- NCTR$ should not account for DATA_ID field (messes up NCNT).
; 06	- Add $ST32 and $DT16 for seconds-since-last-zeroed support.
;--
	.SBTTL	DECLARATIONS

;
; INCLUDE FILES:
;

	.MCALL	POP$S,PUSH$S,SAV5$S

;
; MACROS:
;

	.MACRO	NCTR$	cnt
	JSR	R1,NCTR
	.WORD	cnt
	.ENDM	NCTR$

	.MACRO	NIDN$
	INC	NMNUM
	.ENDM	NIDN$

	.MACRO	NMAP$
	JSR	R2,NMAP
	.ENDM	NMAP$

	.MACRO	NPRM$	typ,cnt
	JSR	R1,NPRM
	.IF	NB,<cnt>
	.BYTE	1+cnt,typ
	.IFF
	.BYTE	-1-1,typ
	.ENDC
	.ENDM	NPRM$

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

	.PSECT	$OWN$,D
NMBIAS:	.WORD	0		; Destination APR5 buffer bias
NMPTR:	.WORD	0		; Current APR5 buffer address
NMCNT:	.WORD	0		; Bytes left in destination buffer
NMNUM:	.WORD	0		; Non-zero if to insert number.
NMPRM:	.WORD	0		; Pointer after last successful insertion.
	.SBTTL	$ST32	- Set 32 bit time in seconds
;++
; FUNCTIONAL DESCRIPTION:
;
;	Set 32 bit time from $TTNS to user area.
;
;	NOTE: not accurate for more than a month uptime!
;
; CALLING SEQUENCE:
;
;	JSR	PC,$ST32
;
; INPUT PARAMETERS:
;
;	R0 = time address
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	R0 = time address+2 (for $DT16).
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$ST32::	PUSH$S	<R2,R3>
	MOV	$TTNS-10,R3	; Get days
	MUL	#24.,R3		; convert to hours
	ADD	$TTNS-6,R3	; add hours
	MOV	R3,R2		; and
	MUL	#60.*60.,R2	; convert to seconds.
	MOV	R3,(R0)		; save intermediate result.
	MOV	R2,2(R0)
	MOV	$TTNS-4,R2	; Get minutes
	MUL	#60.,R2		; convert to seconds
	ADD	$TTNS-2,R3	; add seconds.
	ADD	R3,(R0)+	; Accumulate
	ADC	(R0)		; for his
	ADD	R2,(R0)		; convenience.
	POP$S	<R3,R2>
	RETURN
	.SBTTL	$DT16	- Store 16 Bit Time Difference
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = counter number
;	R0 = address of 32 bit starting time
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DT16::	NCTR$	2.		; Set up DATA ID.
	MOV	R0,R1
	CMP	-(SP),-(SP)	; Make room
	MOV	SP,R0		; for
	CALL	$ST32		; current time.
	SUB	(R1)+,(SP)	; Get low order
	SBC	(R0)		; difference
	SUB	(R1),(R0)	; then high order.
	BEQ	10$		; If overflow beyond 16 bits
	MOV	#-1,(SP)	; then set to overflow value.
10$:	MOVB	(SP),(R2)+	; Store 16 bits.
	MOVB	-(R0),(R2)+
	CMP	(SP)+,(SP)+
	RETURN
	.SBTTL	$AC32	- Add a value to a 32 bit counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	R0 = counter address
;	R1 = value to add
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$AC32::	ADD	R1,(R0)+
	ADC	(R0)
	BCC	90$
	DEC	(R0)
	MOV	(R0),-(R0)
90$:	RETURN
	.SBTTL	$DC16	- Store 16 Bit Counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = counter number
;	R0 = counter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DC16::	NCTR$	2.
	BR	NMCP2
	.SBTTL	$DC32	- Store 32 Bit Counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = counter number
;	R0 = address of counter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DC32::	NCTR$	4.
	BR	NMCP4
	.SBTTL	$DC8	- Store 8 Bit Counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = counter number
;	R0 = counter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DC8::	NCTR$	1.
	MOVB	R0,(R2)+
	RETURN
	.SBTTL	$DC8B	- Store 8 Bit-mapped Counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = counter number
;	R0 = counter value + map in high byte
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DC8B::	NCTR$	3.
	SWAB	R0
	MOVB	R0,(R2)+
	CLRB	(R2)+
	BR	NMCPH
	.SBTTL	$DPAI	- Store AI-n Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = string length
;	R1 = string pointer
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPAI::	NIDN$
$TPAI::	NPRM$	100
	BR	NMCPI
	.SBTTL	$DPC1	- Store C-1 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPC1::	NIDN$
$TPC1::	NPRM$	200+1,1.
	MOVB	R0,(R2)+
	RETURN
	.SBTTL	$DPC2	- Store C-2 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPC2::	NIDN$
$TPC2::	NPRM$	200+2,2.
NMCP2:	MOVB	R0,(R2)+
NMCPH:	SWAB	R0
	MOVB	R0,(R2)+
	RETURN
	.SBTTL	$DPDS1	- Store DS-1 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPDS1::NIDN$
$TPDS1::NPRM$	1*20+1,1.
	MOVB	R0,(R2)+
	RETURN
	.SBTTL	$DPDU1	- Store DU-1 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPDU1::NIDN$
$TPDU1::NPRM$	0*20+1,1.
	MOVB	R0,(R2)+
	RETURN
	.SBTTL	$DPDU2	- Store DU-2 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPDU2::NIDN$
$TPDU2::NPRM$	0*20+2,2.
	BR	NMCP2
	.SBTTL	$DPH1	- Store H-1 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPH1::	NIDN$
$TPH1::	NPRM$	2*20+1,1.
	MOVB	R0,(R2)+
	RETURN
	.SBTTL	$DPH2	- Store H-2 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPH2::	NIDN$
$TPH2::	NPRM$	2*20+2,2.
	BR	NMCP2
	.SBTTL	$DPHI	- Store HI-n Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = string length
;	R1 = string pointer
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPHI::	NIDN$
$TPHI::	NPRM$	2*20
NMCPI:	MOVB	R0,(R2)+
	BEQ	90$
	MOV	10(SP),R1
10$:	MOVB	(R1)+,(R2)+
	SOB	R0,10$
90$:	RETURN
	.SBTTL	$DPCM	- Prepare for CM-n Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPCM::	NIDN$
	NCTR$	1.
	MOVB	R0,(R2)
	BISB	#300,(R2)+
	RETURN
	.SBTTL	$DPO2	- Store O-2 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPO2::	NIDN$
$TPO2::	NPRM$	3*20+2,2.
	BR	NMCP2
	.SBTTL	$DPO4	- Store O-4 Parameter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	2(SP) = parameter number
;	R0 = parameter value
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$DPO4::	NIDN$
$TPO4::	NPRM$	3*20+4,4.
NMCP4:	MOVB	(R0)+,(R2)+
	MOVB	(R0)+,(R2)+
	MOVB	(R0)+,(R2)+
	MOVB	(R0)+,(R2)+
	RETURN
	.SBTTL	$IC32	- Increment a 32 bit counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	R0 = counter address
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$IC32::	INC	(R0)+
	BNE	90$
	INC	(R0)
	BNE	90$
	DEC	(R0)
	DEC	-(R0)
90$:	RETURN
	.SBTTL	$IC8	- Increment a 8 bit counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	R0 = counter address
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$IC8::	INCB	(R0)
	BNE	90$
	DECB	(R0)
90$:	RETURN
	.SBTTL	$NLBEG	- Begin Event Logging Entry
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	None
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$NLBEG::MOV	.LOGPT,R0
	MOV	R0,NMPTR
	INC	NMPTR
	CLR	NMCNT
	MOVB	-(R0),NMCNT
	BR	NPSET
	.SBTTL	$NLEND	- Signal Event Logging Entry
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	R0 = event type/class
;	R1 = entity code
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$NLEND::CALL	NPSET
	SUB	.LOGPT,NMPTR
	DEC	NMPTR
	MOVB	NMPTR,@.LOGPT
	SGNL$S	#CE$EVT,R0,R1,.LOGPT
	RETURN
	.SBTTL	$NRBEG	- Begin NM Response Entry
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	R4 = NM CCB address
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$NRBEG::MOV	C.BUF(R4),NMBIAS
	CALL	NRPTR
	MOV	C.CNT(R4),NMCNT
	CALL	NPSET
	MOV	#1,C.STS(R4)
	RETURN

NRPTR:	MOV	C.BUF+2(R4),NMPTR
	CMP	#140000,NMPTR
	BHI	90$
	SUB	#20000,NMPTR
90$:	RETURN
	.SBTTL	$NREND	- Finish NM Response Entry
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	R4 = NM CCB address
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	C.CNT(R4) = length of data inserted
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
$NREND::CALL	NPSET
	MOV	NMPTR,C.CNT(R4)
	CALL	NRPTR
	SUB	NMPTR,C.CNT(R4)
	TST	NMCNT
	BPL	90$
	MOV	#-4,C.STS(R4)
90$:	RETURN
	.SBTTL	N*	- Set Up Mapping for Parameter/Counter
;++
; FUNCTIONAL DESCRIPTION:
;
;	None
;
; CALLING SEQUENCE:
;
;	None
;
; INPUT PARAMETERS:
;
;	None
;
; IMPLICIT INPUTS:
;
;	None
;
; OUTPUT PARAMETERS:
;
;	None
;
; IMPLICIT OUTPUTS:
;
;	None
;
; CONDITION CODES:
;
;	None
;
; SIDE EFFECTS:
;
;	None
;--

	.PSECT	$CODE$,I,RO
NPSET:	TST	NMCNT
	BPL	10$
	MOV	NMPRM,NMPTR
	RETURN
10$:	MOV	NMPTR,NMPRM
	RETURN

NMAP:	PUSH$S	<@#KISAR5,R2>
	MOV	NMBIAS,@#KISAR5
	MOV	NMPTR,R2
	TST	NMNUM
	BEQ	10$
	CLR	NMNUM
	CALL	NPSET
	SUB	#2,NMCNT
	BMI	10$
	MOVB	12(SP),(R2)+
	MOVB	13(SP),(R2)+
10$:	CALL	@(SP)+
	MOV	R2,NMPTR
	POP$S	<@#KISAR5,R2,R1>
	RTS	PC

NPRM:	NMAP$
	CLR	-(SP)
	MOVB	(R1)+,(SP)
	BPL	20$
	NEGB	(SP)
	ADD	R0,(SP)
20$:	SUB	(SP)+,NMCNT
	BMI	90$
	MOVB	(R1)+,(R2)+
	CALL	(R1)
90$:	RETURN

NCTR:	INC	NMNUM
	NMAP$
	SUB	(R1)+,NMCNT
	BMI	90$
	CALL	(R1)
90$:	RETURN

	.END