Google
 

Trailing-Edge - PDP-10 Archives - BB-P363B-SM_1985 - t20/nmlt20/nmut20.mac
There are 2 other files named nmut20.mac in the archive. Click here to see a list.
; UPD ID= 331, SNARK:<6.1.NML>NMUT20.MAC.4,  16-May-85 23:08:55 by GLINDELL
;  Set up reenter address so that it crashes and dumps NML.
;
; UPD ID= 240, SNARK:<6.1.NML>NMUT20.MAC.3,  20-Jan-85 16:48:43 by GLINDELL
;  Add LOGEVT as a temporary measure until work to support display types
;  has been added to SEND_TO_OPERATOR.
;
; UPD ID= 231, SNARK:<6.1.NML>NMUT20.MAC.2,  17-Jan-85 10:52:52 by GLINDELL
; Remove NMU$FATAL since it is no longer used
; Add NMLDIE routine to dump and halt.
;
; NET:<DECNET20-V3P1.NMU>NMUT20.MAC.2 20-May-81 12:07:24, Edit by JENNESS
;
;    Add SS%CLMESSAGE routine.  It just outputs the string with
;    no vertical or horizontal adjustments.
;
; NET:<DECNET20-V3P1.NMU>NMUT20.MAC.2  5-May-81 10:55:06, Edit by JENNESS
;
;    Add SS%CMESSAGE routine.  It doesn't print the task name.
;    Fix SS%MESSAGE routine to suppress printing null characters at
;    end of the task name.
;
; NET:<DECNET20-V3P1.NMU>NMUT20.MAC.16 18-Mar-81 13:44:02, Edit by JENNESS
;    Rewrite context switch routine so that it doesn't require a stack
;    to be valid when called.
; NMUT20 - TOPS20 specific utility functions
;	   LSG DECnet Network Management

;
;			  COPYRIGHT (c) 1980
;                    DIGITAL EQUIPMENT CORPORATION
;
;     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.
;
	TITLE	NMUT20 - TOPS20 specific utility functions
	SUBTTL	Introduction

Comment	&

	This set of routines implements the TOPS20 versions 
	of utility functions required.  There are two cases
	for these functions:

	   (A)	TOPS20 only functions.  These are  functions
		that are required  for TOPS20  only, and  no
		other operating system uses them.

	   (B)	Generic system  specific  functions.   These
		functions  are  required  of  all  operating
		system interfaces, have  a standard  calling
		convention, but have different code sets  to
		implement them.

	&
	SUBTTL	Definitions

	SALL				; Suppress macro expansions
					; for a clean listing

	SEARCH	MONSYM			; Monitor symbol definitions
	SEARCH	MACSYM			; Useful macros
	SEARCH	JOBDAT			; Job data area

;External references
	EXTERN DEBUG			; Debug word
	EXTERN DB.GLX			; Debugging flag designating private
					;  GALAXY (DEP 135 -1)

; Register definitions

	T0==0				; Temporaries (scratchable)
	T1==1
	T2==2
	T3==3
	T4==4
	P1==5
	P2==6
	P==17				; Stack pointer


define OFF%INTERRUPT
<	MOVEI	T1,.FHSLF
	DIR
	AOS	INTNST##>

define ON%INTERRUPT
<	MOVEI	T1,.FHSLF
	SOSG	INTNST##
	 EIR>
	SUBTTL	SS%SWITCH

; Routine - SS%SWITCH
;
; Function - This routine is called with the address of two task
;	     blocks.  One is the "current" task, the other is for
;	     the "future" task.  When this routine completes a
;	     context switch between the two tasks will have been
;	     done.
;
; Parameters -
;
;	-1(P)	  Future task block address
;	CURTSK/	  Address of current task's task block

	ENTRY	SS%SWITCH
	INTERN	CURTSK, PRVTSK

CURTSK:	BLOCK	1			; Current task block address
PRVTSK:	BLOCK	1			; Previous task block address

SS%SWITCH:
	EXCH	T1,CURTSK		; Save register and get task blk addr
	MOVEM	T1,PRVTSK		; Save as the previous task
	JUMPE	T1,SSS.1		; If no task ... just run new one
	MOVEM	T0,TB.CTX##+T0(T1)	; Save register 0 in context block
	MOVE	T0,CURTSK		; Get contents of register 1
	MOVEM	T0,TB.CTX##+T1(T1)	; Save register 1 in context block
	MOVEI	T0,TB.CTX##+P(T1)	; Calculate end of context block
	ADD	T1,[T2,,TB.CTX##+T2]	; Start of registers to BLT
	BLT	T1,@T0			; Copy into context block

SSS.1:	HRLZ	T0,-1(P)		; Get new task block address
	HLRZM	T0,CURTSK		; Save current task block address
	ADD	T0,[TB.CTX##+T1,,T1]	; Offset to saved registers
	BLT	T0,P			; Copy back registers
	MOVE	T0,CURTSK		; Get current task block address
	ADDI	T0,TB.CTX##+T0		; Offset to register 0
	MOVE	T0,@T0			; Get register 0
	POPJ	P,			; Return to new task
	SUBTTL	SS%TINIT

; Routine - SS%TINIT
;
; Function - This routine sets up a task block for running it
;	the first time.  It does not start the task, only
;	initializes the task block stack.
;
; Parameters -
;
;	-1(P)	Size of task's stack
;	-2(P)	Task block to initialize

	ENTRY	SS%TINIT

SS%TINIT:
	MOVE	T1,-2(P)		; Get address of task block
	MOVEI	T2,TB.STK##(T1)		; Copy it for a stack pointer
	MOVN	T3,-1(P)		; Get length of stack
	HRL	T2,T3			; Make initial stack pointer
	PUSH	T2,[US%FINI##]		; Put task exit routine onto stack
	HRRZ	T3,TB.STR##(T1)		; Get starting address
	PUSH	T2,T3			; Put starting address onto stack
	MOVEM	T2,TB.CTX##+P(T1)	; Set initial stack pointer for task
	POPJ	P,			; Return
	SUBTTL	SS%MESSAGE

; Routine - SS%MESSAGE
;
; Function - This routine outputs a message to the operator
;	or console.
;
; Parameters -
;
;	-1(P)	Byte pointer to error message string

	ENTRY	SS%MESSAGE
        ENTRY   SS%CMESSAGE
	ENTRY	SS%CLMESSAGE

SS%CLMESSAGE:
	MOVE	T1,-1(P)		; Get byte pointer
	PSOUT				; Output supplied message
	POPJ	P,			; Return



SS%CMESSAGE:
	HRROI	T1,[BYTE (7)15,12]	; Point to a CRLF
	PSOUT				; Start message on new line
	SETZ	T4,			; Output all the alignment spaces
	JRST	SS%MS2			; Go print message


SS%MESSAGE:

	HRROI	T1,[BYTE (7)15,12]	; Point to a CRLF
	PSOUT				; Start message on new line

	SKIPN	T2,CURTSK		; Get address of current task block
	 JRST	[HRROI T1,[ASCIZ \ [(none)]:\]
		 PSOUT
		 MOVEI T4,^d10
		 JRST SS%MS2]

	HRROI	T1,[ASCIZ \ [\]		; Start task name output
	PSOUT

	SETZ	T4,			; Clear count of characters
	MOVEI	T2,TB.NAM##(T2)		; Point to name of task
        HRLI	T2,440700
SS%MS1:	ILDB	T3,T2			; Get next character in name
	SKIPE	T3			; Check for null character
	 AOJA	T4,SS%MS1		;  No .. increment count and loop

        CAILE	T4,^d16			; Check bigger than 16 character name
	 MOVEI	T4,^d16			;  Yes .. limit to 16 character output
	MOVEI	T1,.PRIOU		; Primary output (TTY)
	MOVE	T2,CURTSK		; Point to task name
	HRROI	T2,TB.NAM##(T2)
	MOVN	T3,T4			; Get number of characters in name
	SOUT				; Output name string

	HRROI	T1,[ASCIZ \]:\] 	; Terminate the task name
	PSOUT
	ADDI	T4,4			; Add " [", "]:" to count

SS%MS2:	MOVE	T1,[POINT 7,[ASCIZ \                     \]]
	EXCH	T1,T4
	ADJBP	T1,T4
	PSOUT				; Output alignment spaces

	MOVE	T1,-1(P)		; Get byte pointer
	PSOUT				; Output supplied message
	POPJ	P,			; Return
	SUBTTL	LOGEVT - log a network management event

;LOGEVT - log a network management event
;
; Call:	LOGEVT (ptr) : NOVALUE
; i.e.:	-1(P) has addr of text string

LOGEVT::
	MOVE T1,-1(P)		;Get address of string
	MOVEM T1,EVLARG+5	;Watch out numeric offset

	MOVX T1,QU%DBG		;Debug flag
	MOVE T2,DEBUG		;Get debug word
	TXNE T2,DB.GLX		;Using private GALAXY?
	IORM T1,EVLARG+.QUFNC	; -yes, set debugging flag

	MOVEI T1,^D10		;10 words in argument block
	MOVEI T2,EVLARG		; and get address
	QUEUE%			;Shoot!
	 ERJMP .+1		; Ignore errors
	RET			;Return

EVLARG:	QU%NRS!.QUWTO		;No response, WTOPR function
	EXP 0			;No response block
	FLD(^D20,QA%LEN)!FLD(.QBTYP,QA%TYP) ;Length, prived type
	[ASCIZ /Message from DECnet event logger/]
	FLD(^D300,QA%LEN)!FLD(.QBMSG,QA%TYP) ;Length, type
	BLOCK 1			;Address of message
	QA%IMM!FLD(1,QA%LEN)!FLD(.QBDTY,QA%TYP)	;Display type
	.QBEVT			;DECnet event message
	QA%IMM!FLD(1,QA%LEN)!FLD(.QBDFG,QA%TYP)	;Formatting flags
	QU%SJI!QU%NFO
	SUBTTL	NMLDIE - dump and stop NML

;NMLDIE will dump and halt NMLT20.
;
; Call:	NMLDIE (error_pc, ptr_to_error_str);
; i.e.: -2(P) has error_pc
;	-1(P) has ptr_to_error_str

;Set up REENTER address so that @REENTER crashes and dumps NMLT20
	LOC .JBREN
	NMLREE
	RELOC

;NMLREE - come here on REENTER - rely on a stack to exist
NMLREE:	PUSH P,[.JBREN]		;Say that is PC
	PUSH P,[-1,,[ASCIZ /Forced dump with @REENTER/]]
	PUSHJ P,NMLDIE		;Dump NML
	;Will never come back

NMLDIE::
	AOSE DIECNT		;Been here before?
	HALTF%			; -recursion, die

	MOVEM 0,CRSACS		;Save AC 0
	MOVE 0,[1,,CRSACS+1]	;Get BLT AC
	BLT 0,CRSACS+17		; and save all AC's

	OFF%INTERRUPT		;Turn of PI system

	MOVE T1,-2(P)		;Get error PC
	MOVEM T1,CRSPC		; and save it

	MOVE T1,-1(P)		;Get pointer to error string
	MOVEM T1,CRSPTR		; and save that too

	HRROI T1,[ASCIZ /DMP:/]	;DMP:
	STDEV%			;  exists?
	 SKIPA T2,[POINT 7,[ASCIZ /SYSTEM:NMLT20.DMP/]]
	  MOVE T2,[POINT 7,[ASCIZ /DMP:NMLT20.DMP/]]
	MOVX T1,GJ%FOU!GJ%NEW!GJ%SHT ;GTJFN flags
	GTJFN%			;Get JFN
	 ERJMP JSYERR		; Go type out error
	MOVE P1,T1		;P1 will have JFN

	HRROI T1,DIEMSG		;Address of operator message
	HRROI T2,[ASCIZ /
	NMLT20 is crashing, reason: /]
	SETZ T3,		;Stop on zero byte
	SOUT%			;Copy
	 ERJMP JSYERR
	MOVE T2,CRSPTR		;Get crash pointer
	SOUT%			;Append that
	 ERJMP JSYERR
	HRROI T2,[ASCIZ /
	Dumping to file /]
	SOUT%			;Copy
	 ERJMP JSYERR
	MOVE T2,P1		;Get JFN
	MOVX T3,FLD(.JSAOF,JS%DEV)!FLD(.JSAOF,JS%DIR)!FLD(.JSAOF,JS%NAM)!FLD(.JSAOF,JS%TYP)!FLD(.JSAOF,JS%GEN)!JS%PAF
	JFNS%			;Output filespec
	 ERJMP JSYERR
	HRROI T2,[ASCIZ /
/]
	SETZ T3,
	SOUT%
	 ERJMP JSYERR

	HRLI T1,.FHSLF		;Set up for SSAVE (handle,,JFN)
	HRR T1,P1		; so get JFN too
	MOVE T2,[-1000,,SS%RD!SS%CPY!0]	;Do 1000 pages from page 0
	SETZ T3,		;Unused
	SSAVE%			;Save DMP:
	 ERJMP JSYERR		; Go type out error

	MOVX T1,QU%DBG		;Debug flag
	MOVE T2,DEBUG		;Get debug word
	TXNE T2,DB.GLX		;Using private GALAXY?
	IORM T1,QUEARG+.QUFNC	; -yes, set debugging flag

	MOVEI T1,^D8		;8 words in argument block
	MOVEI T2,QUEARG		; and get address
	QUEUE%			;Shoot!
	 ERJMP .+1		; Ignore errors

	HRROI T1,[ASCIZ /RUNNML:/] ;Logical name for program to run
	STDEV%			;Is there any?
	 HALTF%			; -no, all done

	MOVX T1,.FHSLF		;Close all files at or below us
	CLZFF%			;Close..
	 ERJMP JSYERR

	MOVX T1,CR%CAP		;Give subfork our caps
	CFORK%			;Create subfork
	 ERJMP JSYERR
	MOVE P2,T1		;Save handle

	MOVX T1,.FHSLF		;Get our
	RPCAP%			; capabilities
	 ERJMP JSYERR
	MOVE T1,P2		;and set those for our subfork
	EPCAP%
	 ERJMP JSYERR

	MOVX T1,GJ%SHT!GJ%OLD	;Existing file
	HRROI T2,[ASCIZ /RUNNML:/] ;File name
	GTJFN%			;Get JFN
	 ERJMP JSYERR

	HRL T1,P2		;Handle,,JFN
	SETZ T2,		;No page limits
	GET%			;Get the new program into the subfork
	 ERJMP JSYERR

	MOVE T1,P2		;Subfork handle
	SETZ T2,		;Use offset 0
	SFRKV%			;Start subfork
	 ERJMP JSYERR

	MOVEM P2,SPLARG+.SFUIN	;Subfork handle
	MOVX T1,SF%EXT!SPLARG	;Extended splice fork
	SPLFK%			;Replace us with our subfork
	 ERJMP JSYERR		; Error
	HALTF%			;Cannot get here.....

;Splice fork argument block
SPLARG:	EXP 4			;Length
	.SFCOD			;Function code
	0			;Unused
	BLOCK 1			;Subfork handle

;Space for QUEUE% jsys
DIEMSG:	BLOCK ^D50

QUEARG:	QU%NRS!.QUWTO		;No response, WTOPR function
	EXP 0			;No response block
	FLD(^D20,QA%LEN)!FLD(.QBTYP,QA%TYP) ;Length, prived type
	[ASCIZ /Message from DECnet network management/]
	FLD(^D50,QA%LEN)!FLD(.QBMSG,QA%TYP) ;Length, type
	DIEMSG			;Address of message string
	QA%IMM!FLD(1,QA%LEN)!FLD(.QBDFG,QA%TYP)	;Formatting flags
	QU%SJI!QU%NFO

;JSYERR - type out jsys error
JSYERR:	HRROI T1,[ASCIZ /?NMLT20 - jsys error in DIE routine
 /]
	PSOUT%
	MOVX T1,.PRIOU
	MOVE T2,[.FHSLF,,-1]
	SETZ T3,
	ERSTR%
	JFCL
	JFCL
	HALTF%

;Recursion count
DIECNT:	EXP -1

;Crash block
CRSBLK==.
CRSACS:	BLOCK 20
CRSPC:	BLOCK 1
CRSPTR:	BLOCK 1

	END