Google
 

Trailing-Edge - PDP-10 Archives - cuspjul86upd_bb-jf24a-bb - 10,7/galaxy/glxlib/glxcom.mac
There are 26 other files named glxcom.mac in the archive. Click here to see a list.
TITLE	GLXCOM  --  Common module for Sub-Systems Components
SUBTTL	Chuck O'Toole /ILG/MLB/PJT/DC/DPM/NT/CTK 25-Sep-83
;
;
;        COPYRIGHT (c) 1975,1976,1977,1978,1979,1980,1981,1982,
;			 1983,1984,1985,1986
;                    DIGITAL EQUIPMENT CORPORATION
;			 ALL RIGHTS RESERVED.
;
;     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.


	SEARCH	GLXMAC		;PARAMETER FILE
	PROLOG(GLXCOM,COM)	;GENERATE PROLOG CODE
	SEARCH	ORNMAC		;GET ORION SYMBOLS

	COMEDT==55		;MODULE EDIT LEVEL

;	Entry points found in GLXCOM

ENTRY	.INIT	;Initialize the common module
ENTRY	.ZPAGA	;Zero a page given its address in S1
ENTRY	.ZPAGN	;Zero a page given its page number in S1
ENTRY	.ZCHNK	;Zero an arbitrary area of memory

ENTRY	.SAVE1	;Co-routine to save P1
ENTRY	.SAVE2	;Co-routine to save P1,P2
ENTRY	.SAVE3	;Co-routine to save P1,P2,P3
ENTRY	.SAVE4	;Co-routine to save P1,P2,P3,P4
ENTRY	.SAVE8	;Co-routine to save P1,P2,P3,P4,13,14,15,16
ENTRY	.SAVET	;Co-routine to save T1,T2,T3,T4


ENTRY	.SV13	;Co-routine to save 13 (use SAVE Macro)
ENTRY	.SV14	;Co-routine to save 14 (use SAVE Macro)
ENTRY	.SV15	;Co-routine to save 15 (use SAVE Macro)
ENTRY	.SV16	;Co-routine to save 16 (use SAVE Macro)

ENTRY	.RETT	;Set TF= TRUE and return
ENTRY	.RETF	;Set TF= FALSE and return
ENTRY	.RETE	;Set TF= FALSE, set S1=GLXLIB error code and return

ENTRY	.AOS, .SOS , .ZERO 	;Support for INCR, DECR AND ZERO
ENTRY	.STKST, .TRSET		;Support for STKVAR,TRVAR and ASUBR

ENTRY	.POPJ
ENTRY	.POPJ1

ENTRY	.SC2UD,.UD2SC		; Handy routines for second to UDT conversion

ENTRY	.CPUTY			;Determine CPU type

ENTRY	.STOP	;GLXLIB Central STOP CODE processor
SUBTTL Table of contents

;               TABLE OF CONTENTS FOR GLXCOM
;
;
;                        SECTION                                   PAGE
;    1. Table of contents.........................................   2
;    2. Revision History..........................................   3
;    3. Global Storage............................................   4
;    4. .INIT  - Initialize the common code.......................   5
;    5. .ZPAGA - .ZPAGN - .ZCHNK  --  Zero out memory.............   6
;    6. .SAVEx Routines -- Save permanent ACS.....................   7
;    7. .SAVE8 and .SAVET Routines................................   8
;    8. .SVxx  --  Routines for saving random ACS.................   9
;    9. .POPJ, .RETE,.RETT & .RETF -- Common return routines......  10
;   10. .AOS, .SOS and .ZERO - Support for INCR,DECR, ZERO........  11
;   11. STKVAR SUPPORT CODE.......................................  12
;   12. TRVAR SUPPORT CODE........................................  13
;   13. STOP CODE Processor.......................................  14
;   14. SAVCRS  --      Save Crash on Stopcodes...................  15
SUBTTL Revision History

COMMENT \

Edit	SPR/QAR		Explanation
----	-------		-----------------------------------------------
0001			First model
0002			Create from SBSCOM
0003			Convert to new OTS format
0004	G023		Fix Stopcode Processing for -10 and support
			new WTO formats
0005	G035		Make Stopcode always type ACs and Stack
0006	G038		Force No formating of STOPCODES set in WTO
0007	G051		Force out text if STOPCODE Processor fails
0010			Add STKVAR,TRVAR,ASUBR Support Code
0011			Fix .STKRT and .SAVE8 to be Galaxy Compatable
0012			Add TRFLAG to remember True/False
0013			Remove TRFLAG permanently
0014			Clean up .SAVE8
0015			Change ALTOPR reference to PIDTAB+SP.OPR
			in stop code processor
0016			Change stopcode to use $halt instead of I%EXIT
0017			Change $STOP to do $WTO, allow full $TEXT in
			$STOP message
0020			Remove support code for ASUBR macro definition
			Move it temporarily to a file called GLXEXT
0021			Fix support code .TRSET and .STKST to work
			properly when called with JSP .SAC,ADDR
0022			Have STOPCODE use IB.PRG for Program Name
0023			Have STOPCODE use ^E for last TOPS20 error code
0024			Have STOPCODE Save the Crash if not debugging and
			Requested Stopcodes to ORION
0025			Have STOPCODE also process $FATAL macro
0026			Don't allow $FATAL processing to enter DDT
			Fix bug in ITEXT expansion of $FATAL
0027			Change ^A to ^0 in SAVCRS
0030			Change .ZCHNK to BLT the right amount of words
			(If count ia 1)
0031			On the -20 SAVE the STOPCODE Name in the file spec
			name on a crash. Also make GLXVRS external

0032			Fix .ZCHNK to exit if called with a zero count

0033			Fix .STOP so CONTINUE typed after a stopcode won't
			get ? Ill UUO at user PC 000000

0034			Fix .STKST so that it handles skip returns
0035			Zero out our $DATA space on initialization.
0036			Do not send $FATAL errors to ORION

0037			Only dump ACs if IB.STP is set. Only Galaxy components
			should be setting this bit. Also, don't enter DDT. .
			Stupid users don't know what to do at that point anyway.

0040			Make GLXLIB run execute-only.
			Add PORTAL instructions to all return points within
			the many AC/variable save co-routines. This includes
			the STKVAR and TRVAR routines, and calls to the user
			error processor (pointed to by IB.ERR).

0041			Restructure GLXLIB
			 1) Call .RETE via a PUSHJ instead of a JSP. This
			    allows extended addressing to be used someday.
			 2) GLXVRS is no longer external.
			 3) Define global symbols CRSHAC (TOPS-10) and BUGACS
			    (TOPS-20) to point to .SACS. This causes FILDDT
			    to automatically load the ACs from .SACS.

0042			Remove redumdant message "Crash blocks starts at ..."
			from the stopcode text.

0043			Call STKVAR and TRVAR callable via a PUSHJ, not a JSP
			so it will work in a non-zero section.

0044			Turn off interrupts start start of stopcode processing
			and turn them back on when done.

0045			Add .POPJ1 to allow skip returns.

0046			Have .STOP set up its own PDL.
			Don't turn PSI back on until after user PDL restored.

0047			Restore ACs that .STOP trashes before processing reason
			ITEXT block.

0050			Don't allow .ZCHNK to zap the ACs.

0051			Insert 2 new routines .UD2SC and .SC2UD to convert from
			seconds to UDT and back.
0052			Fix up handling of recursive stopcodes.

0053			Add routine .CPUTY to determine the CPU type.

;**;Begin code maintenance for GALAXY 4.1

0054			Fix error in .CPUTY routine.
			SPR 10-33433	25-SEP-83/CTK

0055			Fix non problem coding error.
			SPR 10-33434/CTK

End of Revision History
\
SUBTTL Global Storage


; GLOBAL CRASH INFORMATION

	$DATA	COMBEG,0		;START OF ZEROABLE $DATA SPACE
	$GDATA	.SPC			;PC OF STOP
	$GDATA	.SCODE			;SIXBIT CODE OF STOP CODE
	$GDATA	.SMOD			;SIXBIT MODULE NAME
	$GDATA	.SERR			;LAST OPERATING SYSTEM ERROR (TOPS-20)
TOPS10	<$GDATA	CRSHAC,0>		;CUTE TRICK TO CAUSE FILDDT TO
TOPS20	<$GDATA	BUGACS,0>		; LOAD UP THE ACS FROM .SACS
	$GDATA	.SACS,20		;ACS AT TIME OF STOP 
	$GDATA	.SPTBL			;BASE OF PAGE TABLE
	$GDATA	.SPRGM			;NAME OF PROGRAM
	$GDATA	.SPVER			;VERSION OF PROGRAM
	$GDATA	.SPLIB			;VERSION OF THE OTS

	$GDATA	.LGERR			;LAST GALAXY ERROR PROCESSED VIA .RETE
	$GDATA	.LGEPC			;PC (USUALLY) OF LAST $RETE

	$DATA	STPFLG			;PROCESSING A STOPCODE FLAG
	STPPSZ==60			;STOPCODE PDL SIZE
	$DATA	STPPDL,STPPSZ		;STOPCODE PDL

	$DATA	.SRSN			;Addr of STOPCD reason text
	$DATA	STPOLD			;Old-style STOP flag
	$DATA	WTOPTR			;Byte ptr for TTY portion of WTO msg
	$DATA	WTOADR			;Addr of page for TTY type-out
	$DATA	COMEND,0		;END OF ZEROABLE $DATA SPACE
SUBTTL .INIT  - Initialize the common code

;This code is set up for the stop code processor.
;	Information is copied to the crash block from parameters
;	not known at load time.

;CALL IS:	IIB SETUP

.INIT:	MOVE	S1,[COMBEG,,COMBEG+1]	;BLT PTR TO ZEROABLE $DATA SPACE
;**;[55]CHANGE 1 LINE AT .INIT:+1L	25-SEP-83/CTK
	SETZM	COMBEG			;[55]DO THE FIRST BY HAND
	BLT	S1,COMEND-1		;AND THE REST BY BLT
	MOVE	S1,IIB##+IB.PRG		;GET THE PROGRAM NAME
	MOVEM	S1,.SPRGM		;STORE FOR LATER
	PUSHJ	P,GJBVER##		;Ask GLXINT for the version
	MOVEM	S1,.SPVER		;SAVE IT
	MOVEI	S1,PAGTBL##		;GET ADDRESS OF PAGE TABLE
	MOVEM	S1,.SPTBL		;STORE FOR LATER
	MOVX	S1,GLXVRS		;GET LIBRARY VERSION NUMBER
	MOVEM	S1,.SPLIB		;SAVE IT AWAY
	SETOM	STPFLG			;FLAG NO STOPCODE PENDING
	$RETT				;RETURN
SUBTTL	.ZPAGA - .ZPAGN - .ZCHNK  --  Zero out memory

;ROUTINES TO COMPLETELY ZERO A PAGE OF MEMORY.  .ZPAGA IS
;	CALLED WITH THE ADDRESS OF THE FIRST WORD OF THE PAGE
;	IN S1 AND .ZPAGN IS CALLED WITH THE PAGE NUMBER IN S1.
;	.ZCHNK IS USED TO ZERO A CHUNK OF MEMORY
;	  SIZE IN S1 AND LOCATION S2
;	ALL ACS ARE PRESERVED

.ZPAGN:	PUSH	P,S1			;SAVE PAGE NUMBER
	PG2ADR	S1			;CONVERT PAGE NUMBER TO ADR
	SKIPA				;DON'T SAVE S1 TWICE

.ZPAGA:	PUSH	P,S1			;SAVE S1
	PUSH	P,S2			;AND S2
	MOVE	S2,S1			;GET ADDRESS INTO S2
	MOVX	S1,PAGSIZ		;AND ONE PAGE SIZE INTO S1
	PJRST	ZCHN.1			;JOIN COMMON CODE

.ZCHNK:	TRNN	S1,-1			;Anything to do?
	$RETT				;No..just return
	PUSH	P,S1			;SAVE CALLER'S SIZE
	PUSH	P,S2			;AND ADDRESS
ZCHN.1:	ZERO	0(S2)			;CLEAR FIRST WORD
	SOJE	S1,ZCHN.2		;COUNT OF 1,,JUST RETURN
	ADDI	S1,0(S2)		;COMPUTE END ADDRESS
	CAIGE	S1,20			;OUT OF THE ACS?
	$STOP	(AZA,<Attempt to zero the ACs>) ;++LOSER
	HRLS	S2			;GET ADDR,,ADDR OF CHUNK
	AOS	S2			;AND NOW ADDR,,ADDR+1
	BLT	S2,0(S1)		;NOW CLEAR THE CHUNK
ZCHN.2:	POP	P,S2			;RESTORE CALLER'S CHUNK ADDR
	POP	P,S1			;AND HIS SIZE
	$RETT				;AND RETURN
SUBTTL	.SAVEx routines -- save permanent ACs


; These routines act as co-routines with  the routines which call them.
; Therefore, no corresponding "restore" routines are needed. When the
; calling routine returns to its caller, it actually returns via the
; restore routines automatically. These unconventional looking routines
; actually run about 30% to 40% faster than those in SCAN or the TOPS-10
; monitor.

.SAVE1:	PUSH	P,P1			;SAVE P1
	PUSHJ	P,@-1(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-2(P)			;ADJUST RETURN PC
	POP	P,P1			;RESTORE P1
	SUB	P,[1,,1]		;ADJUST STACK
	POPJ	P,			;RETURN

.SAVE2:	ADD	P,[2,,2]		;ADJUST STACK
	DMOVEM	P1,-1(P)		;SAVE P1 AND P2
	PUSHJ	P,@-2(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-3(P)			;ADJUST RETURN PC
	DMOVE	P1,-1(P)		;RESTORE P1 AND P2
	SUB	P,[3,,3]		;ADJUST STACK
	POPJ	P,			;RETURN

.SAVE3:	ADD	P,[3,,3]		;ADJUST STACK
	DMOVEM	P1,-2(P)		;SAVE P1 AND P2
	MOVEM	P3,0(P)			;SAVE P3
	PUSHJ	P,@-3(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-4(P)			;ADJUST RETURN PC
	DMOVE	P1,-2(P)		;RESTORE P1 AND P2
	MOVE	P3,0(P)			;RESTORE P3
	SUB	P,[4,,4]		;ADJUST STACK
	POPJ	P,			;RETURN

.SAVE4:	ADD	P,[4,,4]		;ADJUST STACK
	DMOVEM	P1,-3(P)		;SAVE P1 AND P2
	DMOVEM	P3,-1(P)		;SAVE P3 AND P4
	PUSHJ	P,@-4(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-5(P)			;ADJUST RETURN PC
	DMOVE	P1,-3(P)		;RESTORE P1 AND P2
	DMOVE	P3,-1(P)		;RESTORE P3 AND P4
	SUB	P,[5,,5]		;ADJUST STACK
	POPJ	P,			;RETURN

SUBTTL	.SAVE8 and .SAVET Routines

.SAVE8:	ADD	P,[10,,10]		;ADJUST STACK
	DMOVEM	P1,-7(P)		;SAVE P1 AND P2
	DMOVEM	P3,-5(P)		;SAVE P3 AND P4
	DMOVEM	13,-3(P)		;SAVE 13 AND 15
	DMOVEM	15,-1(P)		;SAVE 15 AND 16
	PUSHJ	P,@-10(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-11(P)			;ADJUST RETURN PC
	DMOVE	P1,-7(P)		;RESTORE P1 AND P2
	DMOVE	P3,-5(P)		;RESTORE P3 AND P4
	DMOVE	13,-3(P)		;RESTORE 13 AND 15
	DMOVE	15,-1(P)		;RESTORE 15 AND 16
	SUB	P,[11,,11]		;ADJUST STACK
	POPJ	P,			;RETURN


.SAVET:	ADD	P,[4,,4]		;ADJUST STACK
	DMOVEM	T1,-3(P)		;SAVE T1 AND T2
	DMOVEM	T3,-1(P)		;SAVE T3 AND T4
	PUSHJ	P,@-4(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-5(P)			;ADJUST RETURN PC
	DMOVE	T1,-3(P)		;RESTORE T1 AND T2
	DMOVE	T3,-1(P)		;RESTORE T3 AND T4
	SUB	P,[5,,5]		;ADJUST STACK
	POPJ	P,			;RETURN
SUBTTL .SVxx  --  Routines for saving random ACS


; THESE ROUTINES ARE CALLED BY THE SAVE MACRO FOR ABSOLUTE AC'S
;	13,14,15, & 16. THE MACRO FIGURES OUT WHICH ONE

.SV13:	PUSH	P,13			;SAVE AC 13
	PUSHJ	P,@-1(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-2(P)			;ADJUST RETURN PC
	POP	P,13			;RESTORE 13
	SUB	P,[1,,1]		;ADJUST STACK
	POPJ	P,			;RETURN

.SV14:	PUSH	P,14			;SAVE AC 14
	PUSHJ	P,@-1(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-2(P)			;ADJUST RETURN PC
	POP	P,14			;RESTORE 14
	SUB	P,[1,,1]		;ADJUST STACK
	POPJ	P,			;RETURN

.SV15:	PUSH	P,15			;SAVE AC 15
	PUSHJ	P,@-1(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-2(P)			;ADJUST RETURN PC
	POP	P,15			;RESTORE 15
	SUB	P,[1,,1]		;ADJUST STACK
	POPJ	P,			;RETURN

.SV16:	PUSH	P,16			;SAVE AC 16
	PUSHJ	P,@-1(P)		;CALL THE CALLER
	  PORTAL .+3			;NON-SKIP RETURN
	PORTAL	.+1			;SKIP RETURN
	AOS	-2(P)			;ADJUST RETURN PC
	POP	P,16			;RESTORE 16
	SUB	P,[1,,1]		;ADJUST STACK
	POPJ	P,			;RETURN
SUBTTL .POPJ, .POPJ1, .RETE,.RETT & .RETF -- Common return routines


; $RETE calls .RETE to set up the last GALAXY error and location
; then set TF = FALSE and return.

.RETE:	XMOVEI	S1,@(P)		;GET RETURN PC
	HRRZ	S1,(S1)		;GET ERROR CODE
	MOVEM	S1,.LGERR	;AND REMEMBER IT
	POP	P,(P)		;TRIM STACK
				;FALL INTO .RETF (RETURN TO CALLER'S CALLER)

; .RETT AND .RETF are called via the $RETT and $RETF macros and can also
; be called directly.  They both set the value of TF, one to TRUE and the other
; to FALSE.  After doing this, they return via a POPJ P,
;
.RETF:	TDZA	TF,TF		;ZEROS MEAN FALSE
.RETT:	SETO	TF,		;ONES MEAN TRUE
	POPJ	P,		;RETURN


; The .POPJ and .POPJ1 routines can be jumped
; to get a return, without changing the value in the TF register
;
.POPJ1:	AOS	(P)		;SKIP
.POPJ:	POPJ	P,		;RETURN
SUBTTL .AOS, .SOS and .ZERO - Support for INCR,DECR, ZERO

;THIS HAS BEEN OBSOLETED BY NEW INCR,DECR,ZERO MACRO DEFINITIONS

; These routines are never used directly, but are available for the
; INCR, DECR and ZERO macros to use when the field is neither a fullword
; or either half word.

.AOS:	PUSH	P,TF			;SAVE REGISTER WE WILL USE
	HRRZ	TF,-1(P)		;GET LOCATION OF JUMP [POINTR()]
	PUSH	P,@TF			;STORE IN ON THE STACK
	LDB	TF,@0(P)		;GET THE BYTE TO BE INCREASED
	AOJA	TF,ZERO.1		;INCREASE IT AND RETURN

.SOS:	PUSH	P,TF			;SAVE TF
	HRRZ	TF,-1(P)		;PICK UP LOCATION OF CALL
	PUSH	P,@TF			;SAVE ADDR OF POINTER ON STACK
	LDB	TF,@0(P)		;GET THE BYTE
	SOJA	TF,ZERO.1		;DECREASE BY ONE AND RETURN


.ZERO:	PUSH	P,TF			;SAVE TF
	HRRZ	TF,-1(P)		;GET ADDR OF CALL
	PUSH	P,@TF			;SAVE ADDR OF POINTER ON THE STACK
	SETZ	TF,			;GET A ZERO BYTE
ZERO.1:	DPB	TF,@0(P)		;STORE IT BACK
	POP	P,TF			;CLEAR POINTER OF STACK
	POP	P,TF			;RESTORE TF
	POPJ	P,			;THEN RETURN
SUBTTL	STKVAR SUPPORT CODE

;COMMON ENTRY AND EXIT ROUTINE FOR STACK VARIABLE

.STKST::POP	P,.SAC		;GET CALLER'S PC
	ADD P,@.SAC		;BUMP STACK FOR VARIABLES USED
	JUMPGE P,STKSOV		;TEST FOR STACK OVERFLOW
STKSE1:	PUSH P,@.SAC		;SAVE BLOCK SIZE FOR RETURN
	AOS .SAC		;BUMP PAST POINTER
	PUSHJ P,@.SAC		;CONTINUE ROUTINE, EXIT TO .+1
	PORTAL	[SUB P,0(P)	;NON-SKIP/ CLEAR PUBLIC, SET CONCEALED MODE
		 SUB P,[1,,1]	;REMOVE THE COUNT
		 POPJ	P,0]
	PORTAL	.+1		;SKIP/ CLEAR PUBLIC, SET CONCEALED
	SUB P,0(P)		;SKIP RETURN COMES HERE
	SUB P,[1,,1]		;REMOVE COUNT FROM STACK
	AOS	0(P)		;SKIP RETURN
	POPJ P,0		;RETURN

STKSOV:	SUB P,@.SAC		;STACK OVERFLOW- UNDO ADD
	HLL .SAC,@.SAC	;SETUP TO DO MULTIPLE PUSH, GET COUNT
STKSO1:	PUSH P,[0]		;DO ONE PUSH AT A TIME, GET REGULAR
	SUB .SAC,[1,,0]		; ACTION ON OVERFLOW
	TLNE .SAC,777777	;COUNT DOWN TO 0?
	JRST STKSO1		;NO, KEEP PUSHING
	JRST STKSE1
SUBTTL	TRVAR SUPPORT CODE

;SUPPORT ROUTINE FOR TRVAR

.TRSET::POP	P,.SAC		;GET CALLER'S PC
	PUSH P,.FP		;PRESERVE OLD .FP
	MOVE .FP,P		;SETUP FRAME PTR
	ADD P,@.SAC		;ALLOCATE SPACE
	JUMPGE P,TRSOV
	AOS .SAC		;BUMP RETURN ADDRESS
TRSET1:	PUSHJ P,@.SAC		;CONTINUE ROUTINE, EXIT VIA .+1
	PORTAL	[MOVEM .FP,P	;NON-SKIP/ CLEAR PUBLIC, SET CONCEALED
		POP P,.FP	;RESTORE OLD .FP
		POPJ P,]
	PORTAL	.+1		;SKIP/ CLEAR PUBLIC, SET CONCEALED
	MOVEM .FP,P		;HERE IF SKIP RETURN
	POP P,.FP
	AOS 0(P)		;PASS SKIP RETURN
	POPJ P,

TRSOV:	SUB P,@.SAC		;STACK OVERFLOW - UNDO ADD
	HLL .SAC,@.SAC	;GET COUNT
TRSOV1:	PUSH P,[0]		;DO ONE PUSH AT A TIME, GET REGULAR
	SUB .SAC,[1,,0]		; ACTION ON OVERFLOW
	TLNE .SAC,777777	;COUNT TO 0?
	JRST TRSOV1		;NO, KEEP PUSHING
	JRST TRSET1		;CONTINUE SETUP
SUBTTL Time conversion routines -- .SC2UD

;	This routine will conver a number of seconds to day,,fraction
; with relatively good precion. (Adds an extra second/day)
; CALL:
;	(S1) = Number of seconds
;	Returns here with UDT in S1,S2 Number of milliseconds remainder

	RADIX	10		; *** NOTE ***
.SC2UD:	ASHC	S1,-17		; Position fraction correctly
	DIV	S1,[24*60*60]	; Divide by number of seconds in a day
	CAXLE	S2,<^D<24*60*60/2>> ; Over half to the next?
	AOS	S1		; Yes, increment the UDT
	$RETT			; Return

SUBTTL Time conversion routines -- .UD2SC

;	This routine is the opposite of the above. Given a UDT it will convert
; it into the number of seconds represented by it.
; CALL:
;	(S1) = UDT
;	Returns here with S1 = nuber of seconds, S2 trashed

.UD2SC:	MULX	S1,<^D<24*60*60>>	; Multiply by number of secs/day
	ASHC	S1,17			; Position for return
	$RETT

	RADIX	8			; *** BACK TO OCTAL ***
SUBTTL	Determine CPU type


; This routine will determine the CPU type and return a value.
; Call:	PUSHJ	P,.CPUTY
;
; TRUE return:	S1:= CPU type
; FALSE return:	never
;
.CPUTY::PUSHJ	P,.SAVE4		;SAVE SOME ACS
	JFCL	17,.+1			;CLEAR FLAGS
	JRST	.+1			;CHANGE PC
	JFCL	1,CP166			;PDP-6 HAS PC CHANGE FLAG
	MOVNI	P1,1			;MAKE AC ALL ONES
	AOBJN	P1,.+1			;INCREMENT BOTH HALVES
	JUMPN	P1,KA10			;KA10 if P1:= 1000000
	BLT	P1,0			;DO A NO-OP BLT
	JUMPE	P1,KI10			;NO CHANGE IF A KI10
	MOVEI	P1,1			;SET UP A 1
	MOVEI	P2,0			;CLEAR STRING BYTE POINTER
;**;[54]CHANGE 1 LINE AT .CPUTY:+11L	25-SEP-83/CTK
	MOVEI	P4,1			;[54]SET DOUBLE LENGTH BINARY RESULT
	EXTEND	P1,[CVTBDO]		;CONVERT BINARY TO DECIMAL
	TLNE	P4,200000		;KL10 MICROCODE BUG SET THIS BIT
	JRST	KL10			;WE KNOW THIS BUG WON'T BE FIXED
	JRSTF	@[PC.BIS!.+1]		;SET BYTE INCREMENT SUPRESSION
	MOVSI	P1,440700		;BUILD A BYTE POINTER
	ILDB	P2,P1			;DO AN INCREMENT/LOAD BYTE
	JUMPLE	P1,KS10			;KS10 CHECKS FIRST PART DONE
	JRST	XXXX			;XXXX DOESN'T

CP166:	SKIPA	S1,[%PDP6]		;GET PDP6 CODE
KA10:	MOVEI	S1,%KA10		;GET KA10 CODE
	$RETT				;RETURN
KI10:	SKIPA	S1,[%KI10]		;GET KI10 CODE
KL10:	MOVEI	S1,%KL10		;GET KL10 CODE
	$RETT				;RETURN
KS10:	SKIPA	S1,[%KS10]		;GET KS10 CODE
XXXX:	MOVEI	S1,%XXXX		;GET XXXX CODE
	$RETT				;RETURN
SUBTTL STOP CODE Processor

; This routine handles the call caused by the $STOP and $FATAL macros

.STOP:	AOSE	STPFLG			;ALREADY PROCESSING A STOPCODE
	 JRST	STOP.4			;YES - JUST TYPE OUT DUMP ON TTY
	MOVEM	0,.SACS			;STORE FIRST AC
	MOVE	0,[XWD 1,.SACS+1]	;SET FOR THE REST
	BLT	0,.SACS+17		;STORE THEM ALL
	MOVE	P,[IOWD STPPSZ,STPPDL]	;SET UP NEW PDL
	PUSHJ	P,I%IOFF		;TURN OFF INTERRUPTS
	MOVE	S1,.SACS+P		;GET OLD PDL POINTER
	MOVE	S1,0(S1)		;GET LOCATION CALLED FROM
	MOVE	S2,@0(S1)		;THEN GET POINTER WORD TO CODE
	HLLZM	S2,.SCODE		;STORE SIXBIT CODE
	HRRZM	S2,.SRSN		;SAVE ADDRESS OF REASON
	MOVEI	S2,@0(S1)		;GET LOCATION THAT XWD FETCHED FROM
	MOVE	S2,1(S2)		;GET MODULE NAME
	MOVEM	S2,.SMOD		;STORE IT
	MOVEI	S2,-1(S1)		;GET ACTUAL LOCATION OF 'PUSHJ P,.STOP'
	MOVEM	S2,.SPC			;REMEMBER IT
	MOVE	S1,.SCODE		;GET REASON CODE
	SKIPE	IIB+IB.ERR		;ERROR PROCESSOR?
	PUSHJ	P,@IIB+IB.ERR		;YES..CALL IT
	PORTAL	.+1			;CLEAR PUBLIC, SET CONCEALED
	PUSHJ	P,M%GPAG		;SETUP WTO MESSAGE
	MOVEM	S1,WTOADR		;Save start of page for storing
	SETOM	TXTLVL##		;MAKE SURE TEXT WON'T STOP US
	HRLI	S1,(POINT 7,)		;Make a byte pointer
	MOVEM	S1,WTOPTR		;Save it for output
	SKIPE	.SCODE			;Processing a $FATAL message?
	JRST	STOP.1			;No..do full stop code
	$TEXT	(STPDEP,<? ^W/.SPRGM/^A>) ;Output program name
	CAME	S1,.SPRGM		;Same as module name?
	$TEXT	(STPDEP,< ^W/.SMOD/^A>)	;No..output module name
	DMOVE	S1,.SACS+S1		;RELOAD ACS THAT WE STEPPED ON
	$TEXT	(STPDEP,< ^I/@.SRSN/>)	;Output reason
	JRST	STOP.4			;Finish up
STOP.1:	DMOVE	S1,.SACS+S1		;RELOAD ACS THAT WE STEPPED ON
	$TEXT	(STPDEP,<^I/STPHDR/^A>)	;OUTPUT STOPCODE HEADER

TOPS20 <
	MOVX	S1,.FHSLF		;FOR SELF,
	GETER				;LOOK UP MOST RECENT ERROR
	 ERJMP	.+1			;IGNORE ANY ERRORS
	MOVEM	S2,.SERR		;SAVE THE ERROR
	$TEXT	(STPDEP,< Last TOPS-20 error: ^O/.SERR,RHMASK/ (^E/.SERR,RHMASK/)>)
	PUSHJ	P,SAVCRS		;SAVE THE CRASH
> ;END TOPS20 CONDITIONAL

	MOVX	S1,IP.STP		;GET STOPCODE TO ORION FLAG
	TDNN	S1,IIB##+IB.FLG		;CHECK IF SET
	JRST	STOP.4			;NO - ONLY TO TTY, NO AC DUMP
	$TEXT	(STPDEP,<^I/STPACS/^A>)	;DUMP ACS
	MOVE	T1,.SACS+P		;PICK UP PDL POINTER
	$TEXT	(STPDEP,<^I/STPSTK/^A>)	;DUMP LAST FEW STACK LOCATIONS
	SKIPE	MYPID##			;Do we have any PIDs at all?
	SKIPE	IMOPR##			;Yes, Yes, Am I ORION?
	JRST	STOP.4			;No PID, or I'm ORION,
					;Just output to terminal
	$WTO	(< ^W/.SPRGM/ terminated >,<^T/@WTOADR/>,,$WTFLG(WT.NFO))

STOP.4:	SKIPE	S1,WTOADR		;GET MESSAGE ADDRESS
	 PUSHJ	 P,K%SOUT		;DUMP THE DATA
	MOVEI	S1,[ASCIZ/
?Recursion in stopcode handler--Can not continue
/]					;IN CASE WE ARE REALLY SICK
	SKIPE	STPFLG			;FIRST TIME?
	 PUSHJ	P,K%SOUT		;NO--REALLY DEAD
	MOVSI	17,.SACS		;RESTORE THE ACS
	BLT	17,17			;TO THE USER
	PUSHJ	P,I%ION			;TURN ON INTERRUPTS

STPXIT:	$HALT				;Stop without RESET
	JRST	.-1			;Don't allow CONTINUE
; A little routine to output bytes, and advance a pointer
;
STPDEP:	IDPB	S1,WTOPTR		;Just dump the byte
	$RETT				;And return


; ITEXT block for stopcode header
;
STPHDR:	ITEXT	(<
?Stopcode - ^W/.SCODE,LHMASK/ - in module ^W/.SMOD/ on ^H9/[-1]/ on ^C/[-1]/
 Reason: ^I/@.SRSN/
 Program is ^W/.SPRGM/ version ^V/.SPVER/ using GLXLIB version ^V/.SPLIB/
 Crash block starts at location ^O/[.SPC]/
 Last GLXLIB error: ^O/.LGERR,RHMASK/ (^E/.LGERR/)
>)


; ITEXT block for stopcode AC dump
;
STPACS:	ITEXT	(<
 Contents of the ACs:
  0/^O15/.SACS+00/^O15/.SACS+01/^O15/.SACS+02/^O15/.SACS+03/
  4/^O15/.SACS+04/^O15/.SACS+05/^O15/.SACS+06/^O15/.SACS+07/
 10/^O15/.SACS+10/^O15/.SACS+11/^O15/.SACS+12/^O15/.SACS+13/
 14/^O15/.SACS+14/^O15/.SACS+15/^O15/.SACS+16/^O15/.SACS+17/
>)


; ITEXT block for stopcode PDL dump
;
STPSTK:	ITEXT(<
 Last 9 stack locations:
 -1(P)/^O15/-1(T1)/   -2(P)/^O15/-2(T1)/   -3(P)/^O15/-3(T1)/
 -4(P)/^O15/-4(T1)/   -5(P)/^O15/-5(T1)/   -6(P)/^O15/-6(T1)/
 -7(P)/^O15/-7(T1)/   -8(P)/^O15/-8(T1)/   -9(P)/^O15/-9(T1)/
>)
	SUBTTL	SAVCRS	--	Save Crash on Stopcodes

	;This Routine will save the crash for programs that have
	;stopcoded and requested that ORION be informed.

TOPS20	<
SAVCRS:	SKIPE	DEBUGW			;ARE WE DEBUGGING?
	$RETT				;YES..IGNORE SAVE
	MOVX	S1,IP.STP		;GET THE STOPCODE FLAG
	TDNN	S1,IIB##+IB.FLG		;CHECK IF SET?
	$RETT				;NO..IGNORE SAVE
	$TEXT	(<-1,,SAVBUF##>,<^T/SAVNM1/^W/.SPRGM/-^W/.SCODE/-CRASH.EXE^0>)
	MOVX	S1,GJ%FOU!GJ%SHT	;CREATE NEW GENERATION
	HRROI	S2,SAVBUF##		;POINT TO THE STRING
	GTJFN				;GET THE JFN
	   $RETT			;IGNORE IT ..AND RETURN
	HRLI	S1,.FHSLF		;PUT HANDLE IN LEFT HALF (JFN IN RIGHT)
	MOVE	S2,[777760,,20]		;SAVE ALL ASSIGNED NON-ZERO MEMORY
	JSYS	202			;SAVE JSYS (SINCE THERE IS SAVE MACRO)
	ERJMP	.RETT			;IGNORE THE SAVE FAILURE
	$TEXT	(STPDEP,< Crash saved in file: ^T/SAVBUF/>)
	$RETT				;RETURN
SAVNM1:	ASCIZ/PS:<SPOOL>/
>;END TOPS20

COM%L:
	END