; MONTRY	MONITOR TRACE IN & TRACE OUT ROUTINE
;		USED WHEN DEBUGGEG NOT IN
	.TITLE	MONTRY
	.MCALL	POP,PUSH,MINIT
	.GLOBL	$OTSV
	.ENABL	AMA
;
;	MONTRI CALLED BY FORTRAN CALLABLE ASSEM RTNS.
;		JSR	R1,MONTRI
;		.BYTE	NPAR		;# PARMS EXPECTED BY ASSEM RTN
;					;NPAR IS -1 IF VAR NUM OF ARGS
;				MONTRI POPS R5 FOR NON VARIABLE PARM LIST
;		.BYTE	0		;RES FOR FUTURE USE
;		.RAD50	/ASSEM NAME(MUST BE 2 WORDS/
;
;	MONTRI WILL BUILD TRACE BACK CHAIN AND SAVE REGS
;
;	MONTRO	WILL RESTORE REGS(MONTRO IS CALLED INSTEAD OF
;		ASSEM ROUTINE DOING AN RTS PC TO RETURN)
;		POPS TRACE BACK CHAIN
;		RESTORES REGS 0-4
;
;	MONTRF	FUNCTION RETURN-SAME AS MONTRO
;		EXCEPT DOESN'T RESTORE R0
;
	MINIT
.IF	EQ,F4P		;IF FOR
	.IDENT	/V.FOR/
.IFF
	.IDENT	/V.F4P/
.ENDC
LINTF== 0
DBXXI == 1
DBF4PF	== 0	;DEFINE DUMMY FLAG FOR DEBUG
DBIASF	== 0	; DITTO
MONNSF	==	100	;NON STANDARD CALL FLAG
MONTRI::
	PUSH	<R2,R3,R4,R5,R0>	;SAVE REGS
	MOV	(R1)+,R2	;GET PARM CNT AND FLAGS
	MOV	@#$OTSV,R3		;ADDR OF OTS IMPURE AREA
	TST	(R3)+		;ADDR OF SAVE AREA LIST HEAD
.IF	EQ,F4P		;IF FOR COMPILIER
	PUSH	(R0)		;PUT IN TRACE BACK CHAIN
	PUSH	R2		;CALLERS RET ADDR
	PUSH	(R1)+	;FIRST 3 LETTERS OF CALLED ROUTINE NAME
	PUSH	(R1)+		;LAST 3 LETTERS
.IFF			;HERE FOR FOR+ COMPILIER
	PUSH	<2(R1),(R1)+>	;PUT NAME ON STACK
	TST	(R1)+		;SKIP TO RET ADDR
	PUSH	<16.(SP),(R3)>	;RET ADDR & CHAIN PTR
.ENDC
	MOV	SP,(R3)		;UPDATE TRACE BACK LIST HEAD
	PUSH	R1		;CO-RTN RET ADDR
	BIT	#MONNSF*400,R2	;NON-STANDARD CALL ?
	BNE	MONNS		;YES
	MOV	(R5)+,R0	;FETCH PARM CNT
	RTS	PC		;RET TO CO-ROUTINE
MONNS:
	MOV	SP,R3		;RESTORE REGS
	ADD	#22.,R3
	MOV	-(R3),R1
	MOV	-(R3),R2
	MOV	-(R3),R3
	RTS	PC		;RET TO CO-ROUTINE
;
MONTRF::			;FUNCTION RETURN ENTRY
	MOV	SP,R3		;FUNCT RET FLAG
	BR	MONX30
MONTRO::
	BIC	R3,R3		;SUB RET FLAG
MONX30:
	MOV	@#$OTSV,R2	;OTS IMPURE PTR
	MOV	(R2)+,R5	;TRACE BACK CHAIN HEAD
.IF	EQ,F4P		;IF FOR COMPILIER
	MOV	(R2),R1		;STACK ADDR OF TRACE BACK CHAIN
	MOV	6(R1),(R2)	;NEW LIST HEAD
	MOV	4(R1),R5	;REAL RET ADDR
	MOV	R1,SP		;POP TRACE BACK TBL OFF STACK
;;;	ADD	#8.,SP		;POP TRB CHAIN OFF STACK
	MOV	(SP)+,(SP)+
	MOV	(SP)+,(SP)+
.IFF			;IF FOR+ COMPILIER
	MOV	(R2),SP		;RESET STACK PTR
	POP	<(R2),R5>	;RESET LIST HEAD&GET RET ADDR
	MOV	(SP)+,(SP)+	;REMOVE REMAINDER OF CHAIN
.ENDC
	BIT	R3,R3		;FUNCT RET?
	BEQ	MONX40		;NO
	MOV	R0,(SP)	;SAVE R0. WILL BE RETURNED TO CALLER
MONX40:
	POP	<R0,R5,R4,R3,R2,R1>	;RESTORE REGS
	RTS	PC		;RET TO CALLER
DBXXT::
MONIP::	RTS	PC
;
DBSTW::	.WORD	0
	.END
