Google
 

Trailing-Edge - PDP-10 Archives - 704rmsf2 - 10,7/rms10/rmssrc/rmsmes.mac
There are 6 other files named rmsmes.mac in the archive. Click here to see a list.
TITLE	RMSMES - FORMATTED MSG OUTPUTTER
SUBTTL	S. COHEN
SEARCH	RMSINT,RMSMAC
$PROLOG

$PURE

; CONSTANT MEMORY FOR MSG PROCESSOR
;
$ARRAY	(BPOS,0,4,<^D29,^D22,^D15,^D8,^D1>)	;THE BP.POS POSSIB FOR ASCIZ STRINGS
$DATA	(BLANKPT,1,<POINT ASC,BLANKS>)
$DATA	(BLANKS,0,ASCIZ/                                        /)
$DATA	(COMMA,1,<ASCIZ/,/>)
$DATA	(CRLF,1,<BYTE (ASC)15,12>)
$DATA	(DF1,2,<EXP 1.0,0>)
$DATA	(DF10,2,<EXP 10.0,0>)
$DATA	(DSK,1,ASCIZ/DSK:/)
$DATA	(MINUS,1,ASCIZ/-/)
$DATA	(QMARK,1,ASCIZ/?/)
$DATA	(TAB,1,ASCIZ/	/)

$FMT	(RM$ASZ,<-CA%ASZ>)
EXPFMT:	$FMT(,<E,-CA%NUM,-CA%NOCR>)
RFAFMT:	$FMT(,<-CA%NUM,/,-CA%NUM,-CA%NOCR>)

; STATIC VARIABLE MEMORY
;
DEFINE $XDATA(NAM$,SIZ$)<EXTERN NAM$>		;PICK UP DATA FROM GLOBAL LOC
$XDATA	(OV.CAS)				;-1 IF TX.APP, 0 OTHWISE
$XDATA	(OV.DSIG)				;DESIG TO USE ON NEXT CALL for tx.app
$XDATA	(OV.ACT)				;SPECIAL PROC TO CALL ON BUFF OVFLOW
$XDATA	(OV.LEFT)				;# OF CHARS IN MEMBUF, 0R 0
$XDATA	(TXT$CC)				;# OF CHARS WRITTEN TO MEM SINCE CALLER LAST 0-ED IT

SUBTTL	TX$ ENTRY POINTS

$SCOPE	(MSG-OUTPUT)
$LREG	(CAP,6)					;AOBJ PTR TO CURR ARG
$LREG	(ELEMPT,7)				;PTR TO CURR ITEM IN FMT STAT
$LREG	(DESIG,10)				;OUTPUT DESIGNATOR
$LOCALS
 $WORD	(CBUF,^D16)				;FOR BUILDING NUMBERS, DATES, & ERSTR'S
 $WORD	(FLOTMP,2)				;SPACE FOR DP FLO NUM
 $WORD	(STRLEN)				;# OF CHARS IN STRING TO OUTPUT
 $WORD	(TEMP1)					;A WORD FOR ARBIT SHORT-TERM USE
 $WORD	(XTINST,3)				;SPACE FOR EXTEND INST INFO
 $WORD	(STRIBP,2)				;STRING PTR
$ENDLOC

$DATA	(CHBUFP,1,<POINT AS%BYT,CBUF(CF)>)	;FOR CONVING INTEGERS TO STRINGS
						;(INIT USING LOCAL MUST FOL DCL)

$BLISS	(TX$TOUT)
;
; TX$TOUT - OUTPUTS A FORMATTED MSG TO THE PRIMARY OUTPUT DEVICE
; ARGUMENTS:
;	MSGFORMAT = BEGINNING OF THE FMT STATEMENT TO USE
;	MSGPARAM = 0 OR MORE VARIABLES TO BE MERGED WITH THE FMT
	IFN TOP$10,<SETZM DESIG>	;CLEAR IRRELEV CRUFT
	IFN TOP$20,<MOVEI DESIG,.PRIOU>	;TOUT MEANS USE PRIMARY OUTPUT DEVICE
	SETZM	OV.CASE			;INDIC NOT APPENDING
TXIMPD:					;COMM PT FOR ENTS WITH IMPLIC DESIG
	HRRE	CAP,@0(CF)		;PICK UP RIGHT HALF OF INST AT RET LOC
	ADDI	CAP,1(CF)		;PT CAP AT 1ST MSGPARAM ON STK
	JRST	TX.MERGE

$ENTRY	(TX$APP)
;
; TX$APP - APPENDS TO OV.DSIG
; ARGUMENTS:
;	AS FOR TX$TOUT, BUT OV.DSIG IS IMPLICIT STARTING PT
; NOTES:
;	TO USE THIS ROUTINE,
;	YOU MUST INIT OV.DSIG TO BE BP TO BEGIN OF BUFFER
;	YOU MUST INIT OV.LEFT TO MAX CHARS IN BUF
;	INIT TXT$CC TO 0
;	INIT OV.ACT TO PT AT BUFFER FLUSHING ROUTINE.
;	@OV.ACT MUST RESET OV.DSIG TO BEGIN OF BUF & ZERO TXT$CC
;	EACH TIME IT IS CALLED

	MOVE	DESIG,OV.DSIG			;INDIC APPEND CASE
	SETOM	OV.CASE				;INDIC APPENDING
	JRST	TXIMPD				;IMPLICIT DESIG

$ENTRY	(TX$CON)
;
; TX$CON - CONTINUE CALL OF CURR CONTEXT
	JRST	TXEXPD				;EXPLIC DESIG

$ENTRY	(TX$MERG)		;MERGE VARIABLES WITH MSG. ONLY
;
; ARGUMENTS -
;	MSGBUFFER: BUFFER BP OR JFN TO OUTPUT TO (-1,,ADDR==440700,,ADDR)
;	MSGFORMAT: FORMAT STMT
;	MSGPARAMS: PARAMS TO BE MERGED WITH FMT STMT

	SETZM	OV.CAS				;INDIC NOT APP
TXEXPD:						;COMM PT EXPLIC DESIG
	HRRE	CAP,@0(CF)		
	ADDI	CAP,2(CF)			;PT CAP AT 1ST MSGPARAM ON STACK
	MOVE	DESIG,-2(CAP)			;POINT TO BUFFER
	HLRE	T1,DESIG			;ISOL LEFTHALF
	AOSN	T1				;WAS IT -1
	HRLI	DESIG,440700			;YES
	JRST	TX.MERGE

TX.MERGE:
	MOVE	ELEMPT,-1(CAP)			;SET ELEMPT TO PT AT FMT STAT (@MSGPOINT(AP))
MSG.LOOP:
	SKIPN	0(ELEMPT)			;EXPLIC END OF FMT CODE?
	JRST	CA.EXIT				;YES
	HLRE	T1,0(ELEMPT)			;LEFT SIDE TELLS NATURE OF CTL WD?
	JUMPN	T1,L$IFX			;IS IT XWD 0,PTR-TO-ASCIZ?
	  $CALL PUTSTR,<@0(ELEMPT),[0]>		;YES, INDICATE THAT IT IS ASCIZ
	  AOJA ELEMPT,MSG.LOOP			;GET NEXT FORMAT CTL WORD
	$ENDIF
	AOJE	T1,L$IFX			;IS IT SIMPLY ASCIZ STRING?
	  $CALL	PUTSTR,<0(ELEMPT),[0]>		;YES, PUT IT OUT
	  JRST	CA.EXIT				;MUST BE ONLY THING LEFT IN FMT
	$ENDIF
	MOVM	T1,0(ELEMPT)			;SET INDEX TO ABS VAL
	CAIG	T1,CA%IVNUM			;IS IT A PADDED NUMBER?
	$SKIP					;YES
	  MOVSI	T4,(1B0)				;TELL CVTBDO PADDING APPLIC
	  CAIG	T1,CA%ZVNUM			;0 PADDED?
	  $SKIP1				;YES
	    HRRI T4,-CA%ZVNUM(T1)		;NORMALIZE THE FIELD'S SIZE
	    MOVEI TF,"0"			;PAD WITH ZEROES
	    JRST L$IFX(1)
	  $NOSK1				;NO
	    HRRI T4,-CA%IVNUM(T1)		;NORMALIZE THE FIELD'S SIZE
	    MOVEI TF," "			;PAD WITH BLANKS
	  $ENDIF(1)
	  MOVEM	TF,XTINST+1(CF)			;PUT AWAY PAD CHAR
	  JRST	ANY.N				;MERGE WITH NUMERIC PROCESSING
	$ENDIF
	CAIG	T1,CA%IVCOL			;IS IT "COLUMN" SPECIAL CASE
	$SKIP					;YES
	  IFN TOP$10,<ERRI (OAL)>		;NOT SUPPORTED ON 10 YET
	  ADDI	ELEMPT,1			;HOP OVER FMT CODE IMMED
	  MOVEI	T5,-CA%IVCOL(T1)			;ISOL COL NUMBER
	  CAILE	T5,^D132			;EXCEED MAX LINE?
	  ERRI	(OAL)				;COL ARG OUT OF RANGE
	  SUB	T5,TXT$CC			;GET RELAT COL
	  JUMPLE T5,MSG.LOOP			;JUMP IF COL ALREADY PASSED
	  CAILE	T5,^D40				;ENOUGH BLANKS IN BLANK VECTOR
	  ERRI	(OAL)				;NO
	  $CALL	PUTSTR,<BLANKPT,T5>		;PUT THE REQUIRED NUM OF BLANKS OUT
	  JRST	MSG.LOOP			;GET NEXT FMT CODE
	$ENDIF
	CASES	(T1,MX%CA)			;DISPATCH TO DO RIGHT FORMAT CTL

SUBTTL	THE STANDARD CASES

$CASE	(0)					;END OF MSG
CA.EXIT:
;	SKIPE	NOCR(CF)			;NOCR DT SPEC?
;	JRST	L$CASE(CA%NOCR)			;YES
	$CALL	PUTSTR,<CRLF,[0]>		;FINISH MSG TEXT
$CASE	(CA%NOCR)				;END OF MSG SUPPRESSING CRLF
	SKIPGE	OV.CAS				;APPENDING
	MOVEM	DESIG,OV.DSIG			;YES, SAVE UPD BP
	RETT					;WITH # OF CHARS IF MEM COPY
$CASE	(CA%ASZ)				;ASCIZ STRING
	$CALL	PUTSTR,<@0(CAP),[0]>		;DO THE OUTPUT
	ADDI	CAP,1
	AOJA	ELEMPT,MSG.LOOP
$CASE	(CA%CMA)				;PUT OUT A COMMA
	$CALL	PUTSTR,<COMMA,[0]>		;DO IT
	AOJA	ELEMPT,MSG.LOOP			;GET NEXT FMT CODE
$CASE	(CA%CRLF)				;PUT OUT A CRLF
	$CALL	PUTSTR,<CRLF,[0]>		;DO IT
	AOJA	ELEMPT,MSG.LOOP			;GET NEXT FMT CODE
$CASE	(CA%DIR)				;PUT OUT A DIRECTORY STRING
	IFN TOP$20,<
	  HRROI	1,CBUF(CF)			;BUILD IN TEMP AREA
	  MOVE	2,0(CAP)			;DIRECTORY NUMBER
	  JUMPE	2,[$CALL PUTSTR,<DSK,[0]>
		 JRST NODIR]
	  DIRST%					;CONVERT TO STRING
	    ERC	(OAL)				;OUTPUT ARG LIST ERROR
	>						;END IFN TOP$20
	$CALL	PUTSTR,<CBUF(CF),[0]>		;PUT OUT THE DIR STRING
NODIR:	ADDI	CAP,1
	AOJA	ELEMPT,MSG.LOOP			;GO BACK FOR MORE
IFN TOP$20,<
$CASE	(CA%DT)					;DATE & TIME
	TDZA	T5,T5				;0 IS DEFAULT
$CASE	(CA%DTT)				;TIME ONLY
	LOADX	T5,OT%NDA			;SUPPRESS-DATE FLAG
	JRST	DT.GO
$CASE	(CA%DTD)				;DATE ONLY
	LOADX	T5,OT%NTM			;SUPPRESS TIME
	DT.GO:
	$CALL	PUTDT,<T5,0(CAP)>		;PASS CODE & UNIV DT
	ADDI	CAP,1				;HOP OVER THE ARG
	AOJA	ELEMPT,MSG.LOOP			;GET NEXT THING FROM FMT STAT
>						;IFN TOP$20 FOR DATE FUNCTIONS
$CASE	(CA%FIL)				;PUT OUT A FILE NAME
	IFN TOP$20,<
	  HRROI	1,CBUF(CF)			;BUILD IN TEMP AREA
	  HRRZ	2,0(CAP)			;JFN OF FILE NAME
	  SETZ	3,				;USE DEFAULT STRING
	  JFNS%					;PRINT THE NAME
	  ERC	(OAL)				;ARG LIST ERR
	>					;END IFN TOP$20
	$CALL	PUTSTR,<CBUF(CF),[0]>		;PUT OUT THE FILE STRING
	ADDI	CAP,1				;GET PAST ARG
	AOJA	ELEMPT,MSG.LOOP			;GO BACK FOR MORE
$CASE	(CA%FLO)				;SING PREC FLOAT NUM
	$CALL	PUTFLO,<0(CAP)>			;SING PREC NUM
	AOJA	ELEMPT,MSG.LOOP
$CASE	(CA%JSE)				;JSYS ERR CHK
;???	SKIPL	TCS.EC				;JSYS ERROR INVOLVED?
;???	JRST	L$CASE(0)			;NO, TERM USER MSG
	$CALL	PUTSTR,<CRLF,[0]>		;START FRESH LINE
	$CALL	PUTLER				;YES, PUT IT OUT
	JRST	L$CASE(0)			;JSYS MSG ALWAYS ENDS MSG
$CASE	(CA%JSM)				;JUST A JSYS MSG
	$CALL	PUTERS,<0(CAP)>		;PRINT MSG ASSOC WITH PASSED CODE
	ADDI	CAP,1				;HOP OVER PROCESSED ARG
	AOJA	ELEMPT,MSG.LOOP			;GET NEXT FMT CODE
$CASE	(CA%MIN)				;PUT OUT A MINUS SIGN
	$CALL	PUTSTR,<MINUS,[0]>		;DO IT
	AOJA	ELEMPT,MSG.LOOP			;GET NEXT FMT CODE
$CASE	(CA%PNUM)				;PADDED INTEGER
$CASE	(CA%NUM)				;UNPADDED INTEGER
	MOVEI	T4,22				;INDIC MAX LEN, BUT NO RIGHT JUSTIF
	ANY.N:
	MOVE	T5,CHBUFP			;THE DESTINATION
	SKIPL	T2,0(CAP)			;GET THE SINGLE-PREC INTEGER
	$SKIP					;ITS NEGATIVE
	  MOVMS	T2				;FIX IT
	  MOVEI	TAP,"-"				;PUT SIGN OUT
	  DC	TAP,T5				;DONE
	$ENDIF
	MOVE	T1,[CVTBDO "0"]			;DESIRED CONVERT INST
	MOVEM	T1,XTINST(CF)			;PERMANIZE IT
	ADDI	CAP,1
	SETZB	T1,T3				;NO HIGH-ORDER DATA
	EXTEND	T1,XTINST(CF)			;EXTEND OPTION=BIN TO DEC
	$SKIP					;DATA FITS
	  DC T1,T5				;MAKE IT ASCIZ
	  $CALL PUTSTR,<CBUF(CF),[0]>		;OUTPUT IT NOW
	  JRST L$IFX
	$NOSKIP					;DOESNT FIT
	  $CALL PUTSTR,<[ASCIZ/*OVFL*/],[0]>	;FIELD SIZE NOT LARGE ENOUGH
	$ENDIF
	AOJA	ELEMPT,MSG.LOOP
$CASE	(CA%OCT)				;OCTAL NUMBER: XXXXXX,,XXXXXX
	$CALL	PUTOCT,<0(CAP)>			;OUTPUT IT
	AOJA	ELEMPT,MSG.LOOP			;GET ANOTHER MSG SEGMENT
$CASE	(CA%R50)
	MOVE	T1,0(CAP)			;PUT VAL IN AC
	TLZ	T1,740000			;INSURE FLAG BITS OFF
	MOVEI	T4,6				;LEN OF R50 FLD
R50PLP:
	IDIVI	T1,50				;CALC CURR LOW ORD DIGIT
	SETZM	T3				;START WITH NULL MATCH
	CAIL	T2,1				;IN DIGIT RANGE?
	MOVEI	T3,"0"-1(T2)			;YES
	CAIL	T2,13				;IN ALPH RANGE?
	MOVEI	T3,"A"-13(T2)			;YES
	CAIN	T2,45				;MATCH .?
	MOVEI	T3,"."				;YES
	CAIN	T2,46				;MATCH $?
	MOVEI	T3,"$"				;YES
	CAIN	T2,47				;MATCH %?
	MOVEI	T3,"%"				;YES
	JUMPE	T3,R50PLE			;EXIT ON NUL
	PUSH	P,T3				;SAVE TILL END
	SOJG	T4,R50PLP			;LOOP BACK IF MORE LEFT
R50PLE:
	HRREI	T4,-6(T4)			;;GET NEG OF CH PROC BY R50PLP
	MOVE	T5,CHBUFP			;BYTE PTR TO TEMP AREA
R50CLP:
	POP	P,T3				;GET CHAR BACK
	DC	T3,T5				;WRITE IT
	AOJL	T4,R50CLP			;LOOP BACK
	DC	T4,T5				;MAKE ASCIZ
	JRST	SIXPUT				;PUT IT OUT
$CASE	(CA%RFA)				;DISPLAY RFA: P#/ID#
	HRRZ	T1,0(CAP)			;GET P# FROM RFA
	HLRZ	T2,0(CAP)			;GET ID#
	$CALLB	TX$CON,<DESIG,[RFAFMT],T1,T2>
	SKIPGE	OV.CAS				;APPENDING?
	MOVE	DESIG,OV.DSIG			;YES, GET NEW LAST VAL
						;PUT IT OUT RECURS
	ADDI	CAP,1
	AOJA	ELEMPT,MSG.LOOP			;GET NEXT FLD
$CASE	(CA%STP)				;STRING PTR
	DMOVE	T1,@0(CAP)			;PUT LENGTH IN T5
	HRRZS	T2				;MAKE SURE ITS CLEAN
	JUMPE	T2,CANOOP			;NOOP IF NUL STRING
	DMOVEM	T1,STRIBP(CF)			;PERMANIZE IT
	LOAD	T3,BP.SIZ+T1			;CHK TYPE OF STRING
	CAIN	T3,AS%BYT			;ASCII?
	JRST	STP.AS				;YES
	CAIE	T3,9				;EBCDIC?
	CAIN	T3,6				;SIXBIT?
	JRST	STP.TR				;YES
STP.O:
	LC	T5,STRIBP(CF)			;GET A BYT
	$CALL	PUTOCT,<T5>			;OUTPUT IT
	$CALL	PUTSTR,<TAB,[0]>		;FOLLOW IT WITH TAB
	SOSLE	STRIBP+1(CF)			;CHK FOR MORE
	JRST	STP.O				;OUTPUT ANOTHER BYTE
	JRST	STPEXIT
STP.TR:
	ADDI	CAP,1				;PT AT TRANS TAB
	MOVE	T3,0(CAP)			;COPY IT
	HRLI	T3,(MOVST)			;THE DESIRED OPR
	MOVEM	T3,XTINST(CF)			;PUT IT AWAY (NOTE: FILL WDS IGNORED -- NEV PAD)
	EXCH	T1,T2				;PUT BKWARDS FOR EXTEND
	DMOVEM	T1,STRIBP(CF)			;DONE
STP.LP:
	DMOVE	T1,STRIBP(CF)			;GET LEN & BP
	MOVE	T5,CHBUFP			;PT AT DEST BUFF
	MOVEI	T4,100				;DEFAULT AMT TO COPY
	CAIG	T1,100				;GTR THAN MAX?
	MOVEM	T1,T4				;COPY AMT LEFT
	EXTEND	T1,XTINST(CF)			;DO PROPER COPY
	  JFCL					;TRUNCATED OK
	DMOVEM	T1,STRIBP(CF)			;SAVE RESIDUE LEN & LOC
	DC	T4,T5				;APPEND A NUL TO DEST
	$CALL	PUTSTR,<CBUF(CF),[0]>		;PUT OUT WHAT COPIED
	SKIPG	STRIBP(CF)			;ANYTHING LEFT?
	JRST	STPEXIT				;NO
	JRST	STP.LP				;YES, COPY & OUTPUT IT
STP.AS:
	$CALL	PUTSTR,<STRIBP(CF),STRIBP+1(CF)>	;PUT IT OUT
STPEXIT:
	ADDI	CAP,1				;HOP OVER THE ARG
	AOJA	ELEMPT,MSG.LOOP
$CASE	(CA%SIX)				;6-BIT WORD
	MOVE	T1,[POINT 6,0(CAP)]		;MAKE PTR TO WORD
	PUSHJ	P,SIXASZ			;CONV 6BIT TO ASCIZ
SIXPUT:
	$CALL	PUTSTR,<CBUF(CF),[0]>		;PUT IT OUT
	ADDI	CAP,1				;HOP OVER THE ARG
	AOJA	ELEMPT,MSG.LOOP			;GO BACK FOR MORE
$CASE	(CA%TCE)				;TCS ERR STATUS
IFN 0,<
	HRRZ	T2,TCS.EC			;GET ERR CODE
	HLLZS	TCS.EC				;..AND CLEAR IT
	HLRZ	T1,TX.0##(T2)			;GET MNEMONIC FROM VECTOR
	HRRM	T1,TCS.EH			;MERGE WITH COMPON
	HRRZ	T1,TX.0##(T2)			;GET PTR TO ERR TEXT'S FMT STAT
	MOVEM	T1,TEMP1(CF)			;PERMANIZE IT
	CAME	T1,TCS.FM			;IS LAST SAVED MSG THE CURR 1?
						;...WONT = IF INT ERR CAUSE TCS.FM=-1,,FMT
	$SKIP					;YES
	  $CALL	PUTSTR,<TCS.SV,[0]>		;PUT OUT THE ERR BUF
	  AOJA	ELEMPT,MSG.LOOP			;GO BACK FOR MORE
	$NOSKIP					;NO
	  $CALL	PUTSTR,<QMARK,[0]>		;PUT OUT Q MARK
	  $CALL	TX.CASE,<CA%SIX,TCS.EH>		;PUT cccmmm = COMPON/ERR MNEMONIC
	  $CALL	PUTSTR,<BLANKPT,[1]>		;SEP FROM TEXT OF MSG
	  HRRZ	T1,TCS.FM			;ISOL CURR FMT
	  HRRZ	T5,TEMP1(CF)			;TENTA ASSUME NO SAVED MSG
	  CAMN	T1,T5				;A SAVED INT-ERR MSG?
	  MOVEI	T5,TCS.SV			;YES, USE IT
	  $CALL PUTSTR,<0(T5),[0]>		;PUT OUT TEXT OF MSG
	$ENDIF
	$CALL	PUTSTR,<[ASCIZ/ at /],[0]>	;INDIC PC COMING
	$CALL	TX.CASE,<CA%OCT,TCS.PC>		;PUT OUT THE PC
	AOJA	ELEMPT,MSG.LOOP			;GO BACK FOR MORE
>
$CASE	(CA%VARY)
	HRROI	T5,@0(CAP)			;SET UP PSEUDO-BP TO THE VARYING STRING
	HRRZ	T1,-1(T5)			;GET ITS LENGTH
	MOVEM	T1,STRLEN(CF)			;...AND MAKE IT PASSABLE
	JUMPE	T1,CANOOP			;NOOP IF NUL STRING
	$CALL	PUTSTR,<T5,STRLEN(CF)>		;WRITE IT
CANOOP:
	ADDI	CAP,1				;GET PAST THIS ARG
	AOJA	ELEMPT,MSG.LOOP
$CASF						;LABELS FOR THE COMPONENT SPECIFIC CASES
	ERRI	(OAL)

SIXASZ:
; ARGUMENTS:
;	T1 = BP TO STRING
; RETURNS:
;	ASCIZ STRING IN CBUF(CF)
	MOVE	T2,CHBUFP			;THE DEST
	MOVEI	T3,6				;THE LENGTH
SIX.LP:
	LC	TAP,T1				;GET A 6BIT CHAR
	ADDI	TAP,40				;MAKE IT ASCII
	DC	TAP,T2				;PUT IT AWAY
	SOJG	T3,SIX.LP			;COP ANOTHER
	DC	T3,T2				;MAKE ASCIZ
	POPJ	P,
$ENDPROC

$SCOPE	(PUTFLO)
$LREG	(EXPON)
$LREG	(MAXDIG)

$UTIL	(PUTFLO,<NUMVAL>)
;
; PUTFLO - OUTPUTS SING PREC FLOATING NUM
; ARGUMENTS:
;	NUMVAL = VAL TO OUTPUT
; NOTES:
;	NUMBER IS OUTPUT AS 0.nnnnEnn, WITH SIGNS AS NECES
	MOVE	EXPON,@0(AP)			;GET NUM TO PRINT (MISUSE EXPON TO SAVE IT TEMP)
	JUMPN	EXPON,L$IFX			;SPEC CASE OF 0?
		$CALL PUTSTR,<[ASCIZ/0.0/],[0]>	;PUT OUT 0.0
		RETURN
	$ENDIF
	MOVEI	T5,[ASCIZ/0./]			;PRESUME POS
	SKIPG	EXPON				;IS IT POS?
	MOVEI	T5,[ASCIZ/-0./]			;NO, START WITH MINUS
	$CALL	PUTSTR,<0(T5),[0]>		;OUTPUT IT
PFCONV:
	MOVM	T1,EXPON			;FROM NOW ON NEED ONLY MAGN
	SETZM	T2				;INDIC 1 WD OF PREC
	MOVEI	MAXDIG,8			;DEC PREC OF 1 WD FLOAT NUM
	MOVEI	EXPON,1				;ALG WORKS ON NUMS 1 TO 10
	CAML	T1,DF1				;DET DIR TO NORMALIZE
	JRST	PFDECR				;LARGER THAN 1, SHRINK PROB
PFINCR:						;LESS THAN 1, INCREASE IT
	CAML	T1,DF1				;IN 1 TO 10 RANGE YET?
	JRST	PFNORM				;YES, NOW PUT THE NORMALIZED NUM
	DFMP	T1,DF10				;TRY NEXT POW OF 10
	SOJA	EXPON,PFINCR			;NO, EXPON IS SMALLER STILL
PFDECR:						;DECR NUM TO 1 TO 10 RANGE
	DMOVE	T3,DF1				;AVOID REPEATED DIVISIONS
PFDECLP:
	DMOVEM	T3,FLOTMP(CF)			;ADJ BELOW BY 1 POW LT BOUND
	DFMP	T3,DF10				;PREP TO CHK IF NUM GTR 10**N
	CAML	T1,T3				;IS IT?
	AOJA	EXPON,PFDECLP			;YES, STILL MORE NRMIZING TO DO
						;IF T1 INIT IN RANGE, FALLS THRU 1ST TIME
	DFDV	T1,FLOTMP(CF)			;ADJ NUM TO 1 TO 10
PFNORM:
	SETZB	T4,TAP				;MANTISSA TOT & LOW ORD VAL FOR DFSB
PFMAN1:
	FIX	TF,T1				;GET CURR HI ORD DIGIT
	CAIN	MAXDIG,1			;DOWN TO LOW DIGIT?
	FIXR	TF,T1				;YES, ROUND THIS TIME
	IMULI	TAP,^D10			;MAKE ROOM FOR NEW 1'S DIGIT
	ADD	TAP,TF				;MERGE IT
	FLTR	T3,TF				;GET JUST INTEG PART BACK
	DFSB	T1,T3				;MAP X.Y TO .Y
	DFMP	T1,DF10				;MAP .Y TO Y.Z TO REPEAT LOOP
	SOJG	MAXDIG,PFMAN1			;PROC NEXT LOWER DIG
PFM1X:
	MOVE	T1,[^D10000000]			;NUM AT LEAST 10 MILLION
	EXCH	T1,TAP				;PUT DIVISOR IN TAP
	CAME	T1,[^D100000000]			;SPEC CASE OF 100 MILLION?
	$SKIP					;YES
		$CALL	PUTSTR,<[ASCIZ/1/],[0]>	;PUT OUT THE 1 SIGNIF DIG
		AOJA	EXPON,PFOEXP		;MERGE WITH EXPONENT
	$ENDIF
	MOVE	T3,CHBUFP			;PT TO BUF TO BUILD ASC MANTISSA
	SETZM	STRLEN(CF)			;SET INIT LEN TO 0
PFMAN2:
	IDIV	T1,TAP				;ISOL HI-ORD DIGIT & REMAINDER
	ADDI	T1,60				;CONV IT TO ASCII
	DC	T1,T3				;PUT IT IN MANTISSA STRING
	AOS	STRLEN(CF)			;BUMP LEN
	MOVE	T1,T2				;MAKE REMAINDER THE DIVIDEND
	IMULI	T1,^D10				;MAKE DIVIDEND GTR 100 MIL AGAIN
	JUMPN	T1,PFMAN2			;PICK OFF NEXT DIGIT
PFOUT:
	$CALL	PUTSTR,<CHBUFP,STRLEN(CF)>	;OUTPUT MANTISSA
PFOEXP:
	$CALLB	TX$CON,<DESIG,[EXPFMT],EXPON>	;OUTPUT EXPON INFO
	SKIPGE	OV.CAS				;APPENDING?
	MOVE	DESIG,OV.DSIG			;GET LAST POS BACK
	RETURN
$ENDUTIL
$ENDSCOPE(PUTFLO)

$UTIL	(PUTOCT,<NUMVAL>)
;
; PUTOCT - OUTPUTS OCTAL NUMBER
; ARGUMENTS:
;	NUMVAL = VAL TO OUTPUT
	MOVE	T2,@0(AP)			;MATER VAL
	MOVEI	T3,^D12				;MAX # OF BYTES
	MOVE	T4,CHBUFP			;THE DEST
	ADDI	CAP,1				;HOP OVER ARG JUST PUT IN T2
CAOCLP:
	SETZM	T1				;START WITH CLEAN SLATE
	LSHC	T1,3				;MOVE A DIGIT TO T1
	CAMN	T4,CHBUFP			;IS IT A LEADING BYTE?
	JUMPE	T1,L$IFX			;;NO, IGNORE IF THE LEADING BYTE IS 0
	  ADDI T1,"0"				;MAKE IT A CHAR
	  DC T1,T4				;PUT IT AWAY
	$ENDIF
	CAME	T4,CHBUFP			;NON-0 IN LEFT HALF?
	CAIE	T3,7				;HALF DONE SOURCE?
	$SKIP					;YES TO BOTH
	  MOVEI	T1,","				;PUT OUT IN HALF-WORD FMT
	  DC	T1,T4				;COMMA1
	  DC	T1,T4				;COMMA2
	$ENDIF
	SOJG	T3,CAOCLP			;GONE THRU ALL 12 POTENT DIGITS?
	MOVEI	T1,"0"				;PRESUME 0 NUMBER
	CAMN	T4,CHBUFP			;IS 0 IF NOTHING COPIED
	DC	T1,T4				;YES, PUT OUT 1 0
	DC	T2,T4				;MAKE IT ASCIZ (BY NOW T2==0)
	$CALL	PUTSTR,<CBUF(CF),[0]>		;PUT IT OUT
	RETT
$ENDUTIL
$ENDSCOPE(MSG-OUTPUT)

SUBTTL	ROUTINES THAT DO OUTPUT

$UTIL	(PUTERS,<CODERR>)
;
; PUTERS - DO ERSTR FOR SPECIFIED ERROR
; ARGUMENTS:
;	CODERR = CODE OF ERR TO OUTPUT
	MOVE	2,@0(AP)			;GET THE CODE
	IFN TOP$10,<HALT>
	IFN TOP$20,<
	  HRLI	2,.FHSLF			;DO FOR CURR PROCESS
	  JRST	PUERMRG				;DO COMMON STUFF
	>
;
$ENTRY	(PUTLER)
;
; PUTLER - CONSTRUCTS ERROR STRING FOR THE MOST RECENT MONITOR ERROR
;
	$CALL	PUTSTR,<[ASCIZ/Reason is: /],[0]> ;GIVE IT HDR
	IFN TOP$20,<
	  HRLOI	2,.FHSLF			;LAST ERR FOR SELF
PUERMRG:
	  MOVE	1,CHBUFP				;SETUP THE DEST LOC
	  SETZM	3				;ALWAYS ENOUGH ROOM FOR MSG
	  ERSTR%
	    JFCL				;CANT HAPPEN
	    JFCL				;OH YEAH
	>
	$CALL	PUTSTR,<CBUF(CF),[0]>		;APPEND IT TO CURR OUTPUT STRING
;???	HRRZS	TCS.EC				;INDIC JSYS ERR NO LONGER "ACTIVE"
	RETT
$ENDUTIL

$UTIL	(PUTDT,<DTFLAG,INTDT>)
;
; PUTDT - CONVERTS INTERNAL DATE/TIME TO EXT FMT
; ARGUMENTS:
;	DTFLAG = JSYS FLAG
;	INTDT = INTERNAL DATE/TIME
	MOVE	2,@INTDT(AP)			;THE INTERNAL D/T
	MOVE	3,@DTFLAG(AP)			;MATER THE FLAGS
	IFN TOP$20,<
	  MOVE	1,CHBUFP				;PLACE TO BUILD DATE
	  ODTIM%					;DO IT
	  ERC	(OWE)				;COULDNT PUT IT OUT
	  $CALL	PUTSTR,<CBUF(CF),[0]>		;ACTU PUT DATE OUT
	>
	POPJ	P,
$ENDUTIL

$UTIL	(PUTSTR,<ASTRING,LENSTR>)
;
; PUTSTR - OUTPUTS THE STRING TO THE SPECIFIED DESIGNATOR
; ARGUMENTS:
;	ASTRING = BYTE PTR TO WHAT IS BEING OUTPUT
;		= OR THE STRING ITSELF
;	LENSTR = MAX LENGTH OF THE STRING OR 0
;		= IF 0, STRING MUST BE ASCIZ

	MOVE	3,@LENSTR(AP)		;PICK UP STRING LENGTH
	MOVE	2,@ASTRING(AP)		;ASSUME BYTE PTR
	LOAD	1,BP.SIZ+2		;GET BYTE SIZE FLD
	CAIE	1,7			;IS IT ASCII BYTE?
	MOVEI	2,@ASTRING(AP)		;NO, TREAT AS STRING ITSELF
PUTMEM:					;CHK IF "OUTPUTTING" TO MEM
	TLNN	DESIG,777700		;YES, IF DESIG IS BYTE PTR
	$SKIP				;YES
	  PUSHJ P,PCOPYM		;DO WORK 2=SRC,3=LEN,1=DEST
	  RETT				;DONE
	$ENDIF
PUTOUT:
	IFN TOP$10,<
	  TLNN	2,777700		;IS SOURCE A BP?
	  SKIPE	3			;IS THERE A LEN?
	  $NOSKIP			;YES TO EITHER, SO FIX
	    PUSH P,DESIG		;KLUDGE, USE DESIG AS BP IN PCOPYM
	    MOVE DESIG,CHBUFP		;SET DEST
	    PUSHJ P,PCOPYM		;YES TO EITHER, SO FIX
	    SETZM 3			;INSURE ASCIZ
	    DC 3,DESIG			;PUT OUT TRAILING NUL BYTE
	    POP P,DESIG			;GET DESIG BACK 
	    MOVEI 2,CBUF(CF)		;SET UP PTR TO WHERE COPIED
	  $ENDIF
	  OUTSTR 0(2)			;OUTPUT THE STRING
	>
	IFN TOP$20,<
	MOVE	1,DESIG			;TELL SOUT THE OUTPUT STREAM
	  TLNN 2,777700			;BP?
	  HRLI 2,440700			;NO, MAKE 1
	  SETZM 4			;SCAN TO NUL-BYTE IF APPLIC
	  SOUT%				;DO IT
	  ERC	(OWE)			;TXT OUTPUT WRITE ERR
	>
	RETT

PCOPYM:
;
; PCOPYM - COPY ASCII STRING TO MEM
; ARGS: DESIG=DEST BP, 2=SRC BP, 3=LEN OR 0
; RETURNS:
;	UPDATED BP'S
	TLNN T2,777700		;BP?
	HRLI T2,440700		;NO, MAKE 1
PUTMLP:
	LC	TAP,T2			;GET FROM SOURCE
	JUMPE	TAP,PCOPYX		;EXIT IF HIT ASCIZ BYTE
	DC	TAP,DESIG		;STOR TO DEST
	SKIPL	OV.CAS			;APPENDING?
	$SKIP				;YES
	  AOS	T1,TXT$CC		;INCR CHARS COPPED
	  CAMGE	T1,OV.LEFT		;FILLED BUF?
	  JRST	L$IFX			;NO
	  PUSH	P,T2			;SAVE SRC BP
	  PUSH	P,T3			;SAVE CNT OF HOW MUCH LEFT
	  PUSHJ	P,@OV.ACT		;CALL THE FLUSH ROUTINE
	  POP	P,T3			;GET CNT BACK
	  POP	P,T2			;GET SRC BP BACK
	  MOVE	DESIG,OV.DSIG		;RESET CURR POS TO START OF BUF
	$ENDIF
	SOJN	T3,PUTMLP		;LP TIL CNT EXH OR INFIN IF ASZ
PCOPYX:
	POPJ	P,
$ENDUTIL

PRGEND

TITLE	RMSERR - CENTRAL MODULE FOR HANDLING EXCEPTIONAL ERRORS
SUBTTL	S. COHEN
SEARCH	RMSINT,RMSMAC
$PROLOG

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;RIGHT (C) 1977,1978 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

ENTRY	TRAP.H

SUBTTL	THE MGR FOR "SYSTEM" ERRORS

$IMPURE
;$GDATA	(TCS.EC)				;TCS ERROR CODE, SETUP BY UNWINDER
;$GDATA	(TCS.EH)				;SIXBIT ERR MSG PREFIX (EG. CON)
;$GDATA	(TCS.FM)				;LH: -1=IERR, 0=OTHER
						;RH: ADDR OF FMT STAT FOR MSG CURR IN TCS.SV
;$GDATA	(TCS.PC)				;PC IMMED PAST THE TRAP
;$GDATA	(TCS.SV,^D27)				;ONE-LINE BUF FOR SAVED MSG

DEFINE TCS.EC<T4>
DEFINE TCS.PC<T3>

$PURE
DEFINE $FMT(X,Y)<X==:0>			;MAKE IT A NOOP
$FMT	(RM$FPE,<page of form file improperly formatted>)
$FMT	(RM$FRE,<read of form file failed>)
$FMT	(RM$FRO,<root of form file not found>)
$FMT	(RM$FWE,<write of form file failed>)
$FMT	(RM$MMI,<unable to initialize memory manager>)
$FMT	(RM$MMX,<free memory exhausted>)
$FMT	(RM$NME,<no message set up for error>)
$FMT	(RM$OOP,<unable to open text file>)
$FMT	(RM$OWE,<unable to output text message>)

$FMT	(RM$ISE,<internal software error>)
RM$ARG==:RM$ISE
RM$COP==:RM$ISE
RM$CVO==:RM$ISE
RM$MBO==:RM$ISE
RM$MDI==:RM$ISE
RM$MPX==:RM$ISE
RM$MSZ==:RM$ISE
RM$OAL==:RM$ISE
RM$OST==:RM$ISE
RM$TAL==:RM$ISE

SUBTTL	ERROR CODE AND ONE-TIME CODE

; TRAP.H - SETS UP ERROR DATA & "RETURNS" TO DESIRED LOCATION
; ARGUMENTS:
;	FH.OCF(CF) FOR THE REG UNWINDING
;	FH.EH(CF) TO DETERM THE APPROP RETURN LOCATION
; RETURNS:
;	TF = TCSERR ERROR CODE
;	T1 THRU T4 AS AT TIME OF TRAP
;	TCS.EC == -1,,VAL(TF) IF JSYS ERROR / AS-IS,,VAL(TF) OTHERWISE
; NOTES:
;	$EH(LABEL) (IMPLIES TAP GTR 0): ALWAYS JUMP TO SPEC LABEL
;	$EH	(IMPLIES TAP -1)
;		ERR DEF BY H$RET (IMPLIES T5=-1): RET TO LEVEL OF $EH
;		ERR DEF BY H$GO (IMPLIES T5=0): GOTO 1ST ENCOUNTERED $EH(LABEL)
	TDZA	T5,T5			;INDIC TRAP ERR CODE
	SETOM	T5			;INDIC USER ERR CODE
TRAP.H::
	JFCL				;AVAIL SO "HALTF" CAN BE INSERTED FOR DEBUGGING PURPOSES
	POP	P,TAP			;FIGURE OUT WHICH ERROR
	HRRZS	TAP			;MAKE SURE NO FLAGS IN LEFT HALF
	MOVEI	TF,-EH.1##(TAP)		;ERR CODES WILL RANGE FROM 0 IN BOTH DIR
	HRRZ	TAP,0(P)		;GET PTR TO INST AFTER ERR CALL
	MOVEM	TAP,TCS.PC		;PRESERVE PC OF TRAP
	HLRZ	TAP,-2(TAP)		;CHK FOR IMPLIC JSYS ERR
	CAIN	TAP,(JSYS)		;IS INST BEFORE ERRH A JSYS?
	HRROS	TCS.EC			;YES, INDIC THAT JSYS ERR ACTIVE
	HRRM	TF,TCS.EC		;MERGE IN TCS ERR, NOTE THAT LH TCS.EC GUARAN 0K
TRAPLP:					;LOOP TO UNWIND STACK AFTER THE TRAP
	LOAD	TAP,FH.EH(CF)		;GET THE DEFINED ERR HANDLER IF 1
	JUMPE	TAP,L$IFX		;JUMP SAYS NONE
	  $ZERO	FH.EH(CF),0		;PREVENT ERR HANDLER FROM INTERCEPTING ITSELF
					;(,0 SUPPRESSES TEMP REG UPD)
	  CAIE	TAP,-1			;IS IT RETF-SIMUL HANDLER? (CANT SIMUL RETF TO SELF)
	  JRST 0(TAP)			;NO, GO TO EXPLIC ERR HANDLER
	$ENDIF
	HRRZ	TAP,FH.OCF(CF)		;GET THE PREV CF
	LOAD	TAP,FH.EH(TAP)		;GET HIS TRAP CTL FIELD
	CAIN	TAP,-1			;DID PROC SPEC RETF-SIMUL HANDLER?
	JUMPL	T5,TRAPUN		;YES, IS IT AN H$RET TRAP?
TRAPLE:
	MOVEI	TAP,TRAPLP		;NO, "RETURN" TO THIS LOOP
	MOVEM	TAP,FH.RET(CF)		;DONE
TRAPUN:					;UNWIND ANOTHER LEVEL
	LOAD	TAP,FH.ENT(CF)		;+1 OF LOC THAT TELLS REGS SAVED
	JUMPN	TAP,L$IFX		;FH.ENT CAN BE 0 ONLY IF RUNNING OFF STACK
	  HALT				;2ND ORDER INTERNAL ERROR
	$ENDIF
	HRRZ TAP,-1(TAP)		;GET THE EN.. LABEL FROM THE 1ST INST OF ROUTINE
	SUBI TAP,EN..7			;DETERM HOW FAR FROM TOP OF RESTORE SEQ IT IS
	JRST EX..7(TAP)			;START WITH THAT REG

ABORT.::				;DETERM NUMBER OF PROC REGS TO RESTORE
	SETZM	TF			;BUT JUST START WITH INDIC FAILURE RET
	JRST	TRAPUN			;JRST UNWIND TO CALLER
TRAP.U::				;RESUME UNWIND WITH EXISTING ERR CODE
	SETZM	T5			;RESUME IMPLIES TRAP ERR
	JRST	TRAPLE			;RESUME UNWINDING LOOP
END