Google
 

Trailing-Edge - PDP-10 Archives - cuspbinsrc_2of2_bb-fp63b-sb - 10,7/swil/switou.mac
There are 4 other files named switou.mac in the archive. Click here to see a list.
	TITLE	.TOUTS -- SUBROUTINES FOR OUTPUT
	SUBTTL

	SEARCH	SWIDEF,	SWIL		;SWIL PACKAGE DEFINTIONS
	SEARCH	JOBDAT,	MACTEN,	UUOSYM	;STANDARD DEFINITIONS

	SALL				;PRETTY LISTINGS
	.DIREC	FLBLST			;PRETTIER LISTINGS

	TWOSEG	400000			;NICE PURE CODE


	COMMENT	\

COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986,1988.  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.

\
	SUBTTL	Version and Revision History

MAJVER==13	;MAJOR VERSION LEVEL
MINVER==0	;MINOR (MAINTENANCE RELEASE) LEVEL
CSTVER==0	;CUSTOMER VERSION (WHO LAST . . .)
EDTVER==1033	;EDIT LEVEL

%%TOUT==:<BYTE (3)CSTVER(9)MAJVER(6)MINVER(18)EDTVER>
%%SWIL==:%%SWIL	;SHOW (AND SYNCHRONIZE) SWIL VERSION

IF2,<	PURGE	CSTVER,MAJVER,MINVER,EDTVER>



;INITIAL CREATION

;1000	RDH	01-Jan-84
;	Incorporate into SWIL %12(1000), sync edit level at 1000.

;1006	RDH
;	Run in non-zero PC sections.

;1022	LEO	09-Sep-85
;	Do Copyrights.

;1033	RDH	27-DEC-85
;	"+" types out wrong in .TOFSB, treat like ","

;ENTRY POINTS

	ENTRY	.TYOCH


;.TYOCH -- INITIALIZE TYPEOUT ROUTINE
;CALL:	MOVEI	T1,ADDR. OF ROUTINE
;	PUSHJ	P,.TYOCH
;RETURNS PREVIOUS ADDR. IN T1

.TYOCH::EXCH	T1,TYPOUT	;SWAP ADDR.
	POPJ	P,
;.TOLEB -- TYPE ENTER/LOOKUP BLOCK
;CALL:	1/ ADDRESS OF OPEN BLOCK
;	2/ ADDRESS OF EXTENDED LOOKUP/ENTER BLOCK
;	PUSHJ	P,.TOLEB
;USES T1-4

.TOLEB::PUSHJ	P,.SAVE1##	;NEED A PRESERVED AC
	MOVE	P1,T2		;SAVE LOOKUP BLOCK ADDRESS
	SKIPN	T1,.OPDEV(T1)	;GET DEVICE
	JRST	TOLEB1		;NO DEVICE, IGNORE IT
	PUSHJ	P,.TSIXN	;ISSUE IT
	PUSHJ	P,.TCOLN	;ISSUE SEPARATOR
TOLEB1:	MOVEI	T1,.RBPPN(P1)	;ADDRESS OF PPN/PATH BLOCK POINTER
	SKIPE	0(T1)		;GOT A PPN/PATH POINTER?
	PUSHJ	P,.TDIRB	;TYPE OUT DIRECTORY
TOLEB4:	SKIPN	T1,.RBNAM(P1)	;GET FILE NAME
	JRST	TOLEB6		;SKIP THE FILE NAME
	HLRZ	T2,.RBEXT(P1)	;GET EXTENSION
	CAIN	T2,'UFD'	;SEE IF UFD
	JUMPG	T1,[PUSHJ P,.TPPNW ;YES--TYPE AS P,PN UNLESS NAME FORMAT
		    JRST  .+2] ;PROCEED
	PUSHJ	P,.TSIXN	;ELSE ISSUE IN SIXBIT
TOLEB6:	HLLZ	T1,.RBEXT(P1)	;PEEK AHEAD AT THE EXTENSION
	JUMPE	T1,.POPJ	;JUST EXIT IF NO FILE TYPE
	PUSHJ	P,.TDOT		;TYPE DOT
	HLLZ	T1,.RBEXT(P1)	;GET EXTENSION
	PJRST	.TSIXN		;CAP OFF WITH FILE EXTENSION
;.TFBLK -- TYPE SCANER STYLE FILE BLOCK
;.TOFSB -- TYPE SCANER-STYLE FILE BLOCK, WITH EXTENSIONS
;CALL:	MOVEI	T1,ADDR OF BLOCK
;	MOVX	T2,FLAGS,,LENGTH;.TOFSB ONLY
;	PUSHJ	P,.TFBLK/.TOFSB
;
;WHERE "ADDR" IS THE ADDRESS OF THE [FIRST] FILE SPEC BLOCK;
;"FLAGS" ARE:
;	FX.UND		TYPE NODE NAME
;	FX.UDV		TYPE DEVICE NAME
;	FX.UDR		TYPE DIRECTORY NAME
;	FX.UNM		TYPE FILE NAME
;	FX.UEX		TYPE FILE EXTENSION/TYPE
;	FX.UGN		TYPE FILE GENERATION
;	FX.UFS		TYPE FILE CONSTRAINT SWITCHES
;	FX.SND		CONVERT "-" TO "_" (E.G., FOR VAXEN)
;	FX.SGN		PREFIX GENERATION WITH ";"
;"LENGTH" IS LENGTH OF FILE SPEC BLOCK FOR CONCATENATED FILE SPECS
;(IF 0 THEN NO CONCATENATED FILE SPEC BLOCKS WILL BE TYPED).
;
;USES T1-4

.TFBLK::MOVX	T2,<FX.UND!FX.UDV!FX.UDR!FX.UNM!FX.UEX!FX.UGN>
.TOFSB::PUSHJ	P,.SAVE4##	;NEED SOME PROTECTED ACS
	DMOVE	P1,T1		;SAVE FILE SPEC BLOCK ADDRESS AND FLAGS
TOFSB0:	TXNE	P2,FX.UND	;WANT NODE NAME TYPED?
	SKIPN	T1,.FSNOD(P1)	;YES, FETCH NODE NAME, IF ANY
	JRST	TOFSB1		;NO NODE NAME OUTPUT
	PUSHJ	P,TOFSTR	;TYPE NAME
	PUSHJ	P,.TCOLN	;TYPE SEPARATING ":"
	PUSHJ	P,.TCOLN	;TYPE SEPARATING "::"
TOFSB1:	TXNE	P2,FX.UDV	;WANT DEVICE NAME TYPED?
	SKIPN	T1,.FSDEV(P1)	;YES, PICK UP DEVICE (IF ANY)
	JRST	TOFSB2		;NO DEVICE NAME OUTPUT
	PUSHJ	P,TOFSTR	;TYPE DEVICE
	PUSHJ	P,.TCOLN	;TYPE COLON
TOFSB2:	TXNE	P2,FX.UDR	;WANT DIRECTORY NAME TYPED?
	SKIPN	.FSDIR(P1)	;YES, SEE IF DIRECTORY NAME
	JRST	TOFSB4		;NO DIRECTORY NAME OUTPUT
	PUSHJ	P,.TLBRK	;ISSUE OPENING LEFT BRACKET
	MOVE	T1,.FSDIR(P1)	;ADDRESS OF DIRECTORY NAME STRING
	PUSHJ	P,TOFSTR	;TYPE DIRECTORY NAME
	PUSHJ	P,.TRBRK	;ISSUE CLOSING RIGHT BRACKET

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

TOFSB4:	TXNE	P2,FX.UNM	;WANT FILE NAME TYPED?
	SKIPN	T1,.FSNAM(P1)	;YES, GET FILE NAME (IF ANY)
	JRST	TOFSB5		;NO FILE NAME OUTPUT
	PUSHJ	P,TOFSTR	;TYPE OUT FILE NAME
TOFSB5:	TXNE	P2,FX.UEX	;WANT FILE EXTENSION TYPED?
	SKIPN	.FSEXT(P1)	;GOT AN EXTENSION?
	JRST	TOFSB6		;NO EXTENSION OUTPUT
	PUSHJ	P,.TDOT		;TYPE A "."
	MOVE	T1,.FSEXT(P1)	;RETRIEVE FILE EXTENSION
	PUSHJ	P,TOFSTR	; TYPE IT IF NON-BLANK
TOFSB6:	TXNE	P2,FX.UGN	;WANT FILE GENERATION TYPED?
	SKIPN	.FSGEN(P1)	;GOT A GENERATION FIELD?
	JRST	TOFSB7		;NO GENERATION FIELD
	MOVEI	T1,"."		;ASSUME A DOT
	TXNE	P2,FX.SGN	;WANT SEMICOLON INSTEAD?
	MOVEI	T1,";"		;YES
	PUSHJ	P,.TCHAR	;ISSUE GENERATION SEPARATOR
	MOVE	T1,.FSGEN(P1)	;GET FILE GENERATION STRING
	PUSHJ	P,TOFSTR	;AND TYPE IT OUT
TOFSB7:	TXNN	P2,FX.UFS	;WANT SWITCH CONSTRAINTS TYPED TOO?
	JRST	TOFSW9		;NO, SKIP TO CHECK FOR CONCATENATION TYPEOUT

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;TYPE OUT THE SWITCHES TOO!

TOFSW0:	MOVSI	P4,-TOFSWL	;LENGTH OF SWITCH TABLE TABLE
TOFSW1:	SETO	T1,		;THE "NO-VALUE" VALUE
	CAMN	T1,@TOFSWI(P4)	;IS THIS SWITCH PRESENT?
	JRST	TOFSW4		;NO
	PUSHJ	P,.TSLAS	;YES, START THE SWITCH WITH A "/"
	MOVE	T1,TOFSWN(P4)	;GET THE SWITCH NAME
	PUSHJ	P,.TSIXN	;AND TYPE THAT OUT NEXT
	PUSHJ	P,.TCOLN	;INDICATE A VALUE IS COMING UP
	MOVE	T1,@TOFSWI(P4)	;GET THE SPECIFIED SWITCH VALUE
	PUSHJ	P,@TOFSWT(P4)	;AND TYPE IT OUT TOO
TOFSW4:	AOBJN	P4,TOFSW1	;LOOP FOR ALL VALUE SWITCHES
TOFSW9:	TRNN	P2,-1		;GOT LENGTH OF FSB?
	POPJ	P,		;NO, ALL DONE (NO CONCATENATED SPECS)
	LDB	T1,[POINTR .FXMOD(P1),FX.TRM]  ;FETCH FILE SPEC TERMINATOR
	JUMPE	T1,.POPJ	;ALL DONE IF ","
	CAIN	T1,.FXTRC	;IF "+" OPERATOR,
	POPJ	P,		;THEN TREAT LIKE "," (I.E., ALL DONE HERE)
	PUSHJ	P,.TSPAC	;A SPACE FOR NEATNESS
	LDB	T1,[POINTR .FXMOD(P1),FX.TRM]  ;FETCH FILE SPEC TERMINATOR
	ADDI	T1,.CHGWD	;TURN IT INTO OPERATOR META-CHARACTER
	PUSHJ	P,.TFCHR	;TYPE OUT THE FILE EXPRESSION OPERATOR
	PUSHJ	P,.TSPAC	;AND ANOTHER SPACE FOR NEATNESS
	ADDI	P1,(P2)		;ADVANCE FILE SPEC POINTER
	JRST	TOFSB0		;BACK AND TYPE THE NEXT FILE SPEC BLOCK TOO


;HELPER TO TYPE OUT NAME STRINGS

TOFSTR:	HRLI	T1,(POINT 7,)	;MAKE ADDRESS INTO BYTE POINTER
	PUSH	P,T1		;PROTECT BYTE POINTER
	CAIA			;ENTER LOOP
	PUSHJ	P,TOFSTS	;TYPE SINGLE CHARACTER
	ILDB	T1,0(P)		;FETCH NEXT NAME CHARACTER
	JUMPN	T1,.-2		;LOOP TILL END OF STRING
	JRST	TPOPJ		;ADJUST STACK AND RETURN

TOFSTS:	TXNE	P2,FX.SND	;WANT "-" CONVERTED TO "_"??
	CAIE	T1,"-"		;YES, NEED TO CONVERT?
	PJRST	.TCHAR		;OUTPUT CHARACTER STRAIGHT
	MOVEI	T1,"_"		;CONVERT TO UNDERSCORE
	PJRST	.TCHAR		;OUTPUT CONVERTED CHARACTER


;HELPER TO TYPE OUT /LENGTH:MIN:MAX

TFSWLN:	PUSHJ	P,.TBLOK	;TYPE OUT FIRST (MINIMUM) VALUE
	MOVE	T1,.FXFLM(P1)	;GET SECOND (MAXIMUM) VALUE
	AOJE	T1,.POPJ	;IF BLANK, JUST OMIT IT
	PUSHJ	P,.TCOLN	;PREFACE SECOND VALUE FIELD
	MOVE	T1,.FXFLM(P1)	;RETRIEVE MAXIMUM VALUE AGAIN
	PJRST	.TBLOK		;AND TYPE IT OUT TOO
;SWITCH TABLES FOR TOFSB/TOFSW

DEFINE	DOTFSW,<
X	BEFORE,	.FXBFR,	.TDTTM
X	SINCE,	.FXSNC,	.TDTTM
X	ABEFOR,	.FXABF,	.TDTTM
X	ASINCE,	.FXASN,	.TDTTM
X	PBEFOR,	.FXPBF,	.TDTTM
X	PSINCE,	.FXPSN,	.TDTTM
X	LENGTH,	.FXFLI,	TFSWLN
X	ESTIMA,	.FXEST,	.TBLOK
X	VERSIO,	.FXVER,	.TVERW
> ;END OF DOTFSW MACTO



;THE SWITCH INDICES (ASSUME P1 POINTS TO THE FILE SPEC BLOCK)

DEFINE	X(NAM,IDX,RTN),<1B0 IDX(P1)>

TOFSWI:	DOTFSW



;THE SWITCH NAMES

DEFINE	X(NAM,IDX,RTN),<SIXBIT\NAM\>

TOFSWN:	DOTFSW



;THE SWITCH TYPERS

DEFINE	X(NAM,IDX,RTN),<1B0 RTN>

TOFSWT:	DOTFSW

	TOFSWL==.-TOFSWT
;.TDIRB -- TYPE A DIRECTORY BLOCK
;CALL:	MOVEI	T1,ADDRESS OF DIRECTORY WORD OR PATH OR BIWORDS
;	TLO	T1,0 FOR WORD, 1 FOR PATH, 2 FOR BIWORDS
;	PUSHJ	P,.TDIRB
;
;IF NAME FORMAT IS USED (I.E., "PPN" IS NAME, NOT PROJECT,PROGRAMMER)
;THEN DIRECTORY WILL BE TYPED USING "." RATHER THAN "," ON THE RATHER
;LOOSE ASSUMPTION THAT THE FILE SPEC IS TOPS-20 RATHER THAN TOPS-10.
;USES T1-4

.TDIRB::PUSHJ	P,.SAVE4##	;USE P1 AS COMMA/DOT FLAG
	SETZ	P1,		;ASSUME COMMAS

IFE FT$SFD,<
	SKIPE	T1,(T1)		;SEE IF SOMETHING
	PJRST	.TPPNW		;YES--PRINT IT
	POPJ	P,
>

IFN FT$SFD,<
	TLNE	T1,-1		;STRAIGHT (UNQUALIFIED) ADDRESS?
	JRST	TDIRB2		;NO, EITHER PATH OR BIWORDS
	SKIPN	T3,0(T1)	;YES, GET PPN OR PATH POINTER
	POPJ	P,		;NO DIRECTORY, NO TYPEOUT
	TLNE	T3,-1		;PPN OR ADDRESS OF PATH BLOCK?
	JRST	TDIRB2		;PPN, USE STRAIGHT ADDRESS
	MOVEI	T1,.PTPPN(T3)	;PATH BLOCK, POSITION NEW ADDRESS
	HRLI	T1,1		;INDICATE A PATH BLOCK ADDRESS
TDIRB2:	HLRZ	T2,T1		;GET ADDRESS TYPE (PPN, PATH BLOCK, BIWORDS)
	SKIPN	0(T1)		;GOT A DIRECTORY TO TYPE?
	POPJ	P,		;NO
	HRRZ	P4,T1		;POSITION FIRST WORD ADDRESS
	CAIE	T2,0		;IF PATH OR BIWORD FORMAT
	HRLI	P4,-.FXLND	;SET [MAXIMUM] DIRECTORY LENGTH
	SUBI	T2,1		;SET FLAG -1:PPN; 0:PATH; 1:BIWORDS
	MOVE	P3,T2		;SAVE FOR LATER TESTING
	MOVEI	T1,"["		;OUTPUT BREAK
	PUSHJ	P,.TCHAR	; ..
	MOVE	T1,0(P4)	;GET UFD
	CAME	T1,[-1]		;UNLESS -1 OR POSITIVE, USE SIXBIT
	JUMPL	T1,[PUSHJ P,.TSIXN	;TYPE OUT NAME RATHER THAN PPN
		SETO	P1,		;FLAG WANTING DOTS
		JRST	TDIRB4]		;SEE IF ANY SFD'S
	JUMPG	P3,[MOVE T2,1(P4)	;GET MASK
		PUSHJ	P,.TXWWW	;OUTPUT MASKED OCTAL XWD
		JRST	TDIRB4]		;AND PROCEED
	PUSHJ	P,.TXWDW	;TYPE OCTAL HALFWORDS (PPN)
TDIRB4:	AOBJP	P4,TDIRB8	;LOOP UNTIL DONE
	ADD	P4,P3		;OFFSET IF BIWORD INDEXING
	SKIPN	0(P4)		;HIT END OF DIRECTORY PATH YET?
	JRST	TDIRB8		;YES--RETURN TYPING LAST BREAK
	SKIPN	T1,P1		;WANT COMMA OR DOT AS SEPARATOR?
	TROA	T1,","		;COMMA
	MOVEI	T1,"."		;DOT
	PUSHJ	P,.TCHAR	;SEPARATE DIRECTORY NAME ELEMENTS
	MOVE	T1,0(P4)	;GET SFD NAME
	PUSHJ	P,.TSIXN	;TYPE IT
	JRST	TDIRB4		; AND LOOP UNTIL DONE
TDIRB8:	PJRST	.TRBRK		;AND FINISH UP
>
;.TXWWW -- TYPE A MASKED (WILD) OCTAL WORD IN XWD FORMAT
;CALL:	MOVE	T1,WORD
;	MOVE	T2,MASK
;	PUSHJ	P,.TXWWW
;USES T1-3

.TXWWW::MOVSS	T2		;T1,T2=LH(V),RH(V),RH(M),LH(M)
	ROTC	T1,-^D18	;T1,T2=LH(M),LH(V),RH(V),RH(M)
	PUSH	P,T2		;SAVE SECOND HALF (V,,M)
	MOVSS	T1		;T1=LH  V,,M
	PUSHJ	P,.TMOHW	;TYPE MASKED OCTAL HALF-WORD
	PUSHJ	P,.TCOMA	;TYPE COMMA
	POP	P,T1		;RESTORE RH  V,,M
				;FALL INTO .TMOHW

;.TMOHW -- TYPE MASKED OCTAL HALF-WORD
;CALL:	MOVE	T1,[VALUE,,MASK]
;	PUSHJ	P,.TMOHW
;USES T1-3

.TMOHW::TRCN	T1,-1		;MAKE MASK BIT 0 IF NOT WILD
	PJRST	.TASTR		;TYPE * IF ALL WILD
	MOVE	T2,T1		;MOVE TO CONVENIENT PLACE
	MOVEI	T3,6		;SET LOOP COUNT
TMOHW1:	MOVEI	T1,0		;CLEAR ACCUMULATOR
	LSHC	T1,3		;POSITION FIRST DIGIT
	JUMPN	T1,TMOHW3	;GO IF NON-ZERO
	SOJG	T3,TMOHW1	;LOOP UNTIL ALL DONE
TMOHW2:	MOVEI	T1,0		;CLEAR ACCUMULATOR
	LSHC	T1,3		;GET NEXT DIGIT
TMOHW3:	ADDI	T1,"0"		;CONVERT TO ASCII
	TLNE	T2,7		;CHECK MASK
	MOVEI	T1,"?"		;CHANGE TO ? IF WILD
	PUSHJ	P,.TCHAR	;TYPE CHARACTER
	SOJG	T3,TMOHW2	;LOOP UNTIL DONE
	POPJ	P,		;RETURN
;.TDTTM -- TYPE DATE AND TIME IN UNIVERSAL FORMAT
;CALL:	T1/ DATE-TIME IN INTERNAL FORMAT
;	PUSHJ	P,.TDTTM
;USES T1-4

.TDTTM::PUSHJ	P,.CNTDT##	;TAKE APART
;**;[574] Insert @ .TDTTM+1L	JNG	4-May-76
	ADDI	T1,^D500	;[574] ROUND TO SECOND FOR PRINTING
	CAMG	T1,[^D24*^D60*^D60*^D1000]	;[574] PAST MIDNIGHT?
	JRST	TDTTM1		;[574] NO, NORMAL CASE
	ADDI	T2,1		;[574] WAS 23:59:59.835, BUMP DAY
	SUB	T1,[^D24*^D60*^D60*^D1000]	;[574] MAKE TIME 0:0:0
TDTTM1:	PUSH	P,T1		;[574] SAVE TIME
	MOVE	T1,T2		;POSITION DATE
	PUSHJ	P,.TDATE	;TYPE DATE
	PUSHJ	P,.TCOLN	;TYPE COLON
	POP	P,T1		;RESTORE TIME
	PJRST	.TTIME		;TYPE TIME AND RETURN


;.TDATN -- TYPE TODAY'S DATE IN STANDARD FORMAT
;.TDATE -- TYPE DATE IN STANDARD FORMAT OF DD-MMM-YY
;CALL:	MOVEI	T1,DATE IN SYSTEM FORMAT FROM DATE UUO
;	PUSHJ	P,.TDATE/.TDATN
;USES T1-4

.TDATN::DATE	T1,		;GET TODAY'S DATE

.TDATE::PUSHJ	P,.SAVE1##	;SAVE P1
	IDIVI	T1,^D31		;GET DAYS
	MOVE	T4,T1		;SAVE REST
	MOVEI	T1,1(T2)	;GET DAYS AS 1-31
	PUSHJ	P,TDEC2Z	;TYPE IN DECIMAL
	IDIVI	T4,^D12		;GET MONTHS
	MOVEI	T1,[ASCIZ /-Jan/
		    ASCIZ /-Feb/
		    ASCIZ /-Mar/
		    ASCIZ /-Apr/
		    ASCIZ /-May/
		    ASCIZ /-Jun/
		    ASCIZ /-Jul/
		    ASCIZ /-Aug/
		    ASCIZ /-Sep/
		    ASCIZ /-Oct/
		    ASCIZ /-Nov/
		    ASCIZ /-Dec/](P1)	;GET ASCII
	PUSHJ	P,.TSTRG	;TYPE IT
	MOVEI	T1,^D64(T4)	;GET YEAR SINCE 1900
	IDIVI	T1,^D100	;GET JUST YEARS IN CENTURY	[257]
	MOVN	T1,T2		;NEGATE TO GET - SIGN		[257]
	PJRST	.TDECW		;TYPE IT AND RETURN
;.TTIMN -- TYPE CURRENT TIME IN STANDARD FORMAT
;.TTIME -- TYPE TIME IN STANDARD FORMAT OF HH:MM:SS
;CALL:	MOVEI	T1,TIME IS MILLISEC SINCE MIDNIGHT
;	PUSHJ	P,.TTIME/.TTIMN
;USES T1-4

;WARNING: THIS ROUTINE TRUNCATES THE TIME; IT WILL PRINT 15:59:59.995
;	AS 15:59:59, NOT 16:00:00. THIS IS BECAUSE A ROUND UP COULD
;	CAUSE THE DAY TO INCREMENT, AND THIS ROUTINE DOESN'T KNOW THE
;	DAY (IT HAS PROBABLY ALREADY BEEN PRINTED).  THE CALLER OF THIS
;	ROUTINE MUST MAKE SURE THE TIME HAS ALREADY BEEN ROUNDED TO THE
;	NEAREST SECOND HIMSELF.  SEE THE CODE AT .TDTTM FOR AN EXAMPLE.



.TTIMN::MSTIME	T1,		;GET CURRENT TIME

.TTIME::IDIV	T1,[^D3600000]	;GET HOURS
	MOVE	T4,T2		;SAVE REST
	PUSHJ	P,TDEC2Z	;TYPE TWO DIGITS
	PUSHJ	P,.TCOLN	;TYPE COLON
	MOVE	T1,T4		;RESTORE REST
	IDIVI	T1,^D60000	;GET MINS
	MOVE	T4,T2		;SAVE REST
	PUSHJ	P,TDEC2Z	;TYPE TWO DIGITS WITH 0 FILLER
	PUSHJ	P,.TCOLN	;TYPE COLON
	MOVE	T1,T4		;RESTORE THE REST
	IDIVI	T1,^D1000	;GET SECONDS
TDEC2Z:	MOVEI	T2,"0"		;FILL WITH 0
				;FALL INTO .TDEC2

;.TDEC2 -- TYPE DECIMAL AT LEAST TWO DIGITS
;CALL:	SAME AS .TDECW WITH T2=FILLER CHAR (" " OR "0")

.TDEC2::JUMPL	T1,.TDECW	;JUMP IF NEGATIVE
	CAILE	T1,^D9		;SEE IF ONE DIGIT
	PJRST	.TDECW		;NO--JUST OUTPUT
	EXCH	T1,T2		;GET FILLER
	PUSHJ	P,.TCHAR	;TYPE
	MOVEI	T1,"0"(T2)	;CONVERT DIGIT
	PJRST	.TCHAR		;OUTPUT IT AND RETURN
;.TFCHR -- TYPE POSSIBLY FUNNY CHARACTER
;CALL:	MOVEI	T1,CHARACTER
;	PUSHJ	P,.TFCHR
;PRESERVES ALL AC'S

.TFCHR::PUSHJ	P,TSAV12##	;SAVE T1 - T2
	CAIL	T1,40		;SEE IF CONTROL CHARACTER
	JRST	TFCHR5		;NO--PROCEED
	MOVSI	T2,-LNSPCH	;SET SCAN LOOP
TFCHR2:	HLL	T1,SPCH(T2)	;MAKE T1 AGREE
	CAME	T1,SPCH(T2)	;SEE IF MATCH
	AOBJN	T2,TFCHR2	;NO--LOOP
	JUMPGE	T2,TFCHR3	;NO MATCH--PROCEED
	MOVEI	T1,"<"		;MATCH--TYPE INDICATOR
	PUSHJ	P,.TCHAR	; ..
	HLLZ	T1,SPCH(T2)	;GET MNEMONIC
	PUSHJ	P,.TSIXN	;TYPE IT
	MOVEI	T1,">"		;CLOSE
	PUSHJ	P,.TCHAR	;  INDICATOR
	POPJ	P,		;AND RETURN

TFCHR3:	ADDI	T1,100		;CONVERT
	PUSH	P,T1		; AND SAVE CHAR
	MOVEI	T1,"^"		;SET INDICATOR
	JRST	TFCHR7		;AND GO FINISH UP

TFCHR5:	CAIGE	T1,.CHGWD	;SEE IF GUIDE WORD		[507]
	JRST	TFCHR6		;NO--PROCEED			[507]
	SUBI	T1,.CHGWD	;REMOVE OFFSET			[507]
	PUSH	P,GUIDT.(T1)	;SAVE GUIDE WORD		[507]
	MOVEI	T1,"'"		;YES--INDICATE			[507]
	PUSHJ	P,.TCHAR	;OUTPUT GUIDE PREFIX		[507]
	POP	P,T1		;GET GUIDE WORD			[507]
	PUSHJ	P,.TSIXN	;OUTPUT AS SIXBIT		[507]
	MOVEI	T1,"'"		;ADD CLOSING			[507]
	PJRST	.TCHAR		; QUOTE				[507]

TFCHR6:	CAIN	T1,.CHDEL	;RUBOUT?
	PJRST	[MOVEI	T1,[ASCIZ\<DEL>\]
		PJRST	.TSTRG]		;PRINT FUNNY CHARACTER
	PJRST	.TCHAR		;PRINT NORMAL (UPPER/LOWER) ASCII GRAPHIC

;RDH	CAIGE	T1,140		;SEE IF LOWER CASE
;RDH	PJRST	.TCHAR		;NO--JUST TYPE IT
;RDH	SUBI	T1,40		;YES--CONVERT TO UPPER
;RDH	PUSH	P,T1		;SAVE FOR A MINUTE
;RDH	MOVEI	T1,"'"		;SET INDICATOR
TFCHR7:	PUSHJ	P,.TCHAR	;ISSUE INDICATOR
	POP	P,T1		;RESTORE FIXED CHAR
	PJRST	.TCHAR		;AND TYPE IT
;TABLE OF MNEMONIC,,CHARACTER

SPCH:	'EOF',,.CHEOF
	'EOL',,.CHEOL
	'ALT',,.CHALX
	'BEL',,.CHBEL
	'TAB',,.CHTAB
	'LF ',,.CHLFD
	'VT ',,.CHVTB
	'FF ',,.CHFFD
	'CR ',,.CHCRT
	'ESC',,.CHESC
LNSPCH==.-SPCH

;TABLE OF KNOWN GUIDE WORDS
; MUST BE IN ORDER OF VALUES OF THE META-CHARACTER
; (I.E., 4000, 4001, 4002, ETC.)

	DEFINE	YY($GUIDE),<SIXBIT \$GUIDE\>

GUIDT.::Z
	YY	AND
	YY	OR
	YY	NOT
	Z
	Z
	YY	BEGIN
	YY	END
	Z
	YY	IFAND
	Z
	YY	IFNOT
	Z
	Z
	Z
	Z
	YY	IFSAME
	YY	IFDIFF
	YY	IFOLDE
	YY	IFNEWE
	YY	IFSMAL
	YY	IFBIGG
GUIDL.==:.-GUIDT.
GUIDM.==:-GUIDL.
;.TVERW -- TYPE WORD IN VERSION NUMBER FORMAT
;CALL:	T1/ WORD
;	PUSHJ	P,.TVERW
;USES T1-4

.TVERW::MOVE	T4,T1		;PUT IN SAFE PLACE
	LDB	T1,[POINT 9,T4,11] ;GET MAJOR VERSION
	SKIPE	T1		;IF NON-ZERO,
	PUSHJ	P,.TOCTW	; PRINT IN OCTAL
	LDB	T1,[POINT 6,T4,17] ;GET MINOR VERSION
	JUMPE	T1,TVER2	;IF NON-ZERO,
	SOS	T1		;  PRINT IN MODIFIED
	IDIVI	T1,^D26		;  RADIX 26 ALPHA
	JUMPE	T1,TVER1	;  JUMP IF ONE CHAR
	MOVEI	T1,"A"-1(T1)	;  ISSUE FIRST OF TWO
	PUSHJ	P,.TCHAR	;  CHARACTERS
TVER1:	MOVEI	T1,"A"(T2)	;  ISSUE "UNITS"
	PUSHJ	P,.TCHAR	;  CHARACTER
TVER2:	HRRZ	T1,T4		;GET EDIT NUMBER
	JUMPE	T1,TVER3	;IF NON-ZERO,
	MOVEI	T1,"("		;  ISSUE
	PUSHJ	P,.TCHAR	;  AS OCTAL
	HRRZ	T1,T4		;  WITHIN
	PUSHJ	P,.TOCTW	;  PARENTHESES
	MOVEI	T1,")"		;  ..
	PUSHJ	P,.TCHAR	;  ..
TVER3:	LDB	T2,[POINT 3,T4,2] ;GET "WHO" FIELD
	JUMPE	T2,.POPJ	;IF NON-ZERO,
	MOVEI	T1,"-"		;  PRINT -
	PUSHJ	P,.TCHAR	;  AND THEN
	MOVE	T1,T2		;  THE FIELD
	PJRST	.TOCTW		;  AS OCTAL
;.TBLOK -- TYPE NUMBER IN BLOCKS, ETC.
;.TCORW -- TYPE NUMBER IN CORE SIZE
;CALL:	1/ SIZE TO TYPE
;	PUSHJ	P,.TBLOK/.TCORW
;USES T1-4

.TBLOK::TRNE	T1,177		;SEE IF EVEN BLOCKS
	PJRST	TCORWD		;NO--ISSUE IN WORDS
	MOVE	T4,["B",,177]	;ELSE INDICATE BLOCKS
	JRST	TCORTP		;AND GO OUTPUT

.TCORW::JUMPE	T1,TCORWD	;IF NULL, DO IN WORDS
	MOVE	T4,["K",,1777]	;PRESET FOR K
	JUMPPT	(T2,TCORKA,TCORKA)  ;IF PDP-6 OR KA-10, DO IN K
	MOVE	T4,["P",,777]	;ELSE, INDICATE PAGES
TCORKA:	TDNE	T1,T4		;SEE IF ROUND UNITS
	JRST	TCORWD		;NO--DO IN WORDS
TCORTP:	IDIVI	T1,1(T4)	;YES--DIVIDE BY UNITS
	SKIPA			; AND OUTPUT
TCORWD:	MOVSI	T4,"W"		;INDICATE WORDS
	PUSHJ	P,.TDECW	;ISSUE SIZE
	HLRZ	T1,T4		;GET SIZE UNIT INDICATOR
	PJRST	.TCHAR		;ISSUE THAT AND RETURN
;.TCRLF -- TYPE CARRIAGE RETURN/LINE FEED
;CALL:	PUSHJ	P,.TCRLF
;PRESERVES ALL ACS

.TCRLF::PUSH	P,T1		;SAVE CHARACTER
	MOVEI	T1,.CHCRT	;GET CARRIAGE RETURN
	PUSHJ	P,.TCHAR
	MOVEI	T1,.CHLFD	;GET LINE FEED
	PUSHJ	P,.TCHAR	;TYPE IT
TPOPJ:	POP	P,T1		;RESTORE CHARACTER
	POPJ	P,		;RETURN


;.TPPNW -- SUBROUTINE TO TYPE A PPN
;CALL:	MOVE	T1,PPN
;	PUSHJ	P,.TPPNW
;USES	T1, T2, T3

.TPPNW::PUSH	P,T1		;SAVE ARGUMENT
	PUSHJ	P,.TLBRK	;START UP A PPN
	POP	P,T1		;RECOVER ARGUMENT
	JUMPL	T1,[PUSHJ P,.TSIXN
		    JRST  .TRBRK]
	PUSHJ	P,.TXWDW	;TYPE XWD
	PJRST	.TRBRK		;CAP OFF THE PPN


;.TSIXN -- TYPE OUT SIXBIT WORD
;CALL:	MOVE	T1,WORD
;	PUSHJ	P,.TSIXN
;USES T1, T2

.TSIXN::MOVE	T2,T1		;MOVE ARGUMENT
TSIXN1:	JUMPE	T2,.POPJ	;LOOP UNTIL ONLY BLANKS LEFT
	MOVEI	T1,0		;CLEAR NEXT CHARACTER
	LSHC	T1,6		;GET NEXT CHARACTER
	ADDI	T1," "-' '	;CONVERT TO ASCII
	PUSHJ	P,.TCHAR	;TYPE IT
	JRST	TSIXN1		; ..
;.TXWDW -- TYPE OUT N AS TWO OCTAL HALF-WORDS
;CALL:	MOVE	T1,WORD
;	PUSHJ	P,.TXWDW
;USES T1, T2, T3

.TXWDW::PUSH	P,T1		;PRESERVE ARGUMENT
	HLRZ	T1,T1
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TCOMA	;ISSUE COMMA
	POP	P,T1		;RESTORE ARGUMENT
	HRRZ	T1,T1
			;FALL INTO .TOCTW


;.TDECW -- TYPE OUT SIGNED DECIMAL NUMBER
;.TOCTW -- TYPE OUT SIGNED OCTAL NUMBER
;.TRDXW -- TYPE OUT SIGNED NUMBER (RADIX IN T3)
;	(IF RADIX .GT. 9, WILL USE ALPHAS AFTER DIGITS)
;CALL:	MOVE	T1,NUMBER
;	PUSHJ	P,.TOCTW/.TDECW/.TRDXW
;USES T1, T2, T3

.TOCTW::SKIPA	T3,[10]		;INITIALIZE FOR OCTAL RADIX
.TDECW::MOVEI	T3,^D10		;INITIALIZE FOR DECIMAL RADIX
.TRDXW::JUMPGE	T1,TRDXW1	;CHECK FOR NEGATIVE
	MOVE	T2,T1		;SAVE AWAY ARGUMENT
	MOVEI	T1,"-"		;YES--GET MINUS
	PUSHJ	P,.TCHAR	;PRINT IT
	MOVE	T1,T2		;RESTORE NUMBER
TRDXW1:	IDIV	T1,T3		;DIVIDE BY RADIX
	MOVMS	T2		;GET MAGNITUDE
	PUSH	P,T2		;SAVE REMAINDER
	SKIPE	T1		;SEE IF ANYTHING LEFT
	PUSHJ	P,TRDXW1	;YES--LOOP BACK WITH PD LIST
	POP	P,T1		;GET BACK A DIGIT
	ADDI	T1,"0"		;CONVERT TO ASCII
	CAILE	T1,"9"		;SEE IF OVERFLOW DIGITS
	ADDI	T1,"A"-"9"-1	;YES--SWITCH TO ALPHABETICS
	PJRST	.TCHAR		;TYPE IT AND RETURN
;.TDECD -- TYPE OUT SIGNED DECIMAL DOUBLE-WORD NUMBER
;.TOCTD -- TYPE OUT SIGNED OCTAL DOUBLE-WORD NUMBER
;.TRDXD -- TYPE OUT SIGNED DOUBLE-WORD NUMBER (RADIX IN T3)
;	(IF RADIX .GT. 9, WILL USE ALPHAS AFTER DIGITS)
;CALL:	MOVE	T1+T2,NUMBER
;	PUSHJ	P,.TOCTD/.TDECD/.TRDXD
;USES T1, T2, T3, T4

.TOCTD::SKIPA	T3,[10]		;INITIALIZE FOR OCTAL RADIX
.TDECD::MOVEI	T3,^D10		;INITIALIZE FOR DECIMAL RADIX
.TRDXD::PUSHJ	P,.SAVE4##	;NEED LOTS OF ACS HERE!
	MOVE	T4,T3		;POSITION RADIX
	SETZ	T3,		;AND MAKE A DOUBLE-WORD OUT OF IT
	DMOVE	P1,T1		;POSITION NUMBER OUT OF HARM'S WAY
	JUMPGE	T1,TRDXD1	;CHECK FOR NEGATIVE
	MOVEI	T1,"-"		;YES--GET MINUS
	PUSHJ	P,.TCHAR	;PRINT IT
	SETOB	P3,P4		;DOUBLE-WORD -1
	DMUL	P1,P3		;QUAD WORD BUT POSITIVE "RIGHT HALF"
	DMOVE	P1,P3		;POSITION POSITIVE DOUBLE-WORD
TRDXD1:	DMOVE	P3,P1		;LOW-ORDER HALF OF QUAD-WORD
	SETZB	P1,P2		;HIGH-ORDER HALF OF QUAD WORD
	DDIV	P1,T3		;DIVIDE BY RADIX
	PUSH	P,P4		;SAVE REMAINDER
	CAIN	P1,0		;IF DOUBLE-WORD
	CAIE	P2,0		; QUOTIENT IS STILL NON-ZERO
	PUSHJ	P,TRDXD1	;THEN RECURSE BACK FOR REMAINDER
	POP	P,T1		;GET BACK A DIGIT
	ADDI	T1,"0"		;CONVERT TO ASCII
	CAILE	T1,"9"		;SEE IF OVERFLOW DIGITS
	ADDI	T1,"A"-"9"-1	;YES--SWITCH TO ALPHABETICS
	PJRST	.TCHAR		;TYPE IT AND RETURN
;.T----  --  TYPE OUT SPECIFIC CHARACTER
;
;ALL USE T1

.TTABC::MOVEI	T1,.CHTAB	;GET TAB
	PJRST	.TCHAR		;ISSUE AND RETURN

.TSPAC::MOVEI	T1," "		;GET A SPACE
	PJRST	.TCHAR		;ISSUE AND RETURN

.TBANG::MOVEI	T1,"!"		;GET EXCLAMATION POINT
	PJRST	.TCHAR		;ISSUE AND RETURN

.TDQTE::MOVEI	T1,""""		;GET DOUBLE-QUOTE
	PJRST	.TCHAR		;ISSUE AND RETURN

.THASH::MOVEI	T1,"#"		;GET HASH MARK
	PJRST	.TCHAR		;ISSUE AND RETURN

.TPERC::MOVEI	T1,"%"		;GET PERCENT-SIGN
	PJRST	.TCHAR		;ISSUE AND RETURN

.TSQTE::MOVEI	T1,"'"		;GET SINGLE-QUOTE
	PJRST	.TCHAR		;ISSUE AND RETURN

.TASTR::MOVEI	T1,"*"		;GET ASTERISK
	PJRST	.TCHAR		;ISSUE AND RETURN

.TCOMA::MOVEI	T1,","		;GET COMMA
	PJRST	.TCHAR		;ISSUE AND RETURN

.TDASH::MOVEI	T1,"-"		;GET DASH
	PJRST	.TCHAR		;ISSUE AND RETURN

.TDOT::	MOVEI	T1,"."		;GET DOT (OR PERIOD)
	PJRST	.TCHAR		;ISSUE AND RETURN

.TSLAS::MOVEI	T1,"/"		;GET SLASH
	PJRST	.TCHAR		;ISSUE AND RETURN

.TCOLN::MOVEI	T1,":"		;GET COLON
	PJRST	.TCHAR		;ISSUE AND RETURN

.TSEMI::MOVEI	T1,";"		;GET SEMI-COLON
	PJRST	.TCHAR		;ISSUE AND RETURN

.TQUES::MOVEI	T1,"?"		;GET QUESTION-MARK
	PJRST	.TCHAR		;ISSUE AND RETURN

.TLANG::MOVEI	T1,"<"		;LEFT (OPEN) ANGLE BRACKET
	PJRST	.TCHAR		;ISSUE AND RETURN

.TRANG::MOVEI	T1,">"		;RIGHT (CLOSE) ANGLE BRACKET
	PJRST	.TCHAR		;ISSUE AND RETURN

.TLPRN::MOVEI	T1,"("		;LEFT (OPEN) PARENTHESIS
	PJRST	.TCHAR		;ISSUE AND RETURN

.TRPRN::MOVEI	T1,")"		;RIGHT (CLOSE) PARENTHESIS
	PJRST	.TCHAR		;ISSUE AND RETURN

.TLBRK::MOVEI	T1,"["		;LEFT (OPEN) SQUARE BRACKET
	PJRST	.TCHAR		;ISSUE AND RETURN

.TRBRK::MOVEI	T1,"]"		;RIGHT (CLOSE) SQUARE BRACKET
	PJRST	.TCHAR		;ISSUE AND RETURN

.TLBRC::MOVEI	T1,"{"		;LEFT (OPEN) BRACE
	PJRST	.TCHAR		;ISSUE AND RETURN

.TRBRC::MOVEI	T1,"}"		;RIGHT (CLOSE) BRACE
	PJRST	.TCHAR		;ISSUE AND RETURN
;.TSTRG -- TYPE ASCIZ STRING
;CALL:	MOVEI	T1,LOCTN. OF STRING
;	PUSHJ	P,.TSTRG
;USES T1

.TSTRG::HRLI	T1,(POINT 7)	;CONVERT ADDRESS TO POINTER
	TRNN	T1,-1		;SEE IF SOMETHING THERE
	POPJ	P,		;NO--RETURN EMPTY HANDED
	PUSH	P,T1		;STORE IN SAFE PLACE		[501]
TSTRG1:	ILDB	T1,(P)		;GET NEXT CHARACTER		[501]
	JUMPE	T1,TPOPJ	;RETURN WHEN DONE		[501]
	PUSHJ	P,.TCHAR	;OUTPUT CHARACTER
	JRST	TSTRG1		;LOOP UNTIL DONE


;.TCHAR -- TYPE ASCII CHARACTER
;CALL:	MOVEI	T1,CHARACTER
;	PUSHJ	P,.TCHAR
;PRESERVES ALL ACS

.TCHAR::SKIPE	TYPOUT		;SEE IF SPECIAL ROUTINE
	PJRST	@TYPOUT		;YES--GO DO IT INSTEAD
	OUTCHR	T1		;LET MONITOR DO IT
.POPJ:	POPJ	P,		;AND RETURN
;DATA STORAGE AREA

	RELOC
.TOUTZ::!			;START OF LOW CORE AREA
TYPOUT: BLOCK	1		;ROUTINE TO TYPE ONE CHARACTER
.TOUTL==:.-.TOUTZ		;LENGTH OF LOW CORE AREA
	RELOC
	PRGEND
	TITLE	.VERBO -- ROUTINE TO RETURN /MESSAGE SETTINGS
	SUBTTL

	SEARCH	SWIDEF,	SWIL		;SWIL PACKAGE DEFINTIONS
	SEARCH	JOBDAT,	MACTEN,	UUOSYM	;STANDARD DEFINITIONS

	SALL				;PRETTY LISTINGS
	.DIREC	FLBLST			;PRETTIER LISTINGS

	TWOSEG	400000			;NICE PURE CODE

;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986,1988.  ALL RIGHTS RESERVED.

	COMMENT	\

COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986,1988.  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.

\
DEFINE CLEARO,<
 IFE FT$TNX,<
	SKPINL
	  JFCL
>

 IFN FT$TNX,<
	MOVEI	T1,.PRIOU
	RFMOD
	TXO	T2,TT%OSP
	SFMOD
>>

IFN FT$TNX,<
 DEFINE OUTSTR (TEXT)<
	HRROI	1,TEXT
	PSOUT
>

DEFINE OUTCHR (ACC)<
 IFN ACC-1,<
	HRRZ	1,ACC
>
	PBOUT
>
>;END IFN FT$TNX
;ENTRY POINTS

	ENTRY	.VERBO,.ERMSA,.ERMSG
;.ERMSG/.ERMSA -- ROUTINES TO ISSUE STANDARD ERROR MESSAGE PREFIXES
;CALL:	1/ MODULE CODE (0=SYSTEM),,MESSAGE CODE   IN SIXBIT
;	2/ (11) ??? (7) LEAD CHAR,,[ASCIZ TEXT]
;	3/ ???,,ADDRESS OF ERROR IF .ERMSA
;	PUSHJ P,.ERMSG/.ERMSA
;RETURN +1 WITH 1/ LH(ARG 2),,/VERBOS BITS
;USES T2-4

.ERMSG::MOVEI	T3,0		;CLEAR ADDRESS
.ERMSA::PUSH	P,T2		;SAVE CONTROL BITS
	PUSH	P,T3		;SAVE ADDRESS
	PUSH	P,T1		;SAVE PREFIXES
	HLRZ	T1,T2		;GET PREFIX CHARACTER
	ANDI	T1,177		;MASK TO JUST LEAD CHARACTER
	CAIN	T1,"?"		;IF FATAL ERROR,
	SKIPE	.FLCBF		;SEE IF FIRST FATAL ERROR	[354,567]
	JRST	ERMSG1		;NO, PROCEED			[567]
	CLEARO			;YES--CLEAR ^O			[567]
	SETOM	.FLCBF		; INDICATE TO CLEAR TYPE-AHEAD
ERMSG1:	PUSHJ	P,.TNEWL##	;GO TO START OF LINE		[355]
	PUSHJ	P,.TCHAR##	;ISSUE LEAD CHARACTER
	PUSHJ	P,.VERBO	;GET /MESSAGE
	MOVE	T4,T1		;COPY TO SAFER PLACE
	POP	P,T1		;GET PREFIX
	TLNN	T1,-1		;SEE IF SYSTEM CODE
	HRLZS	T1		;YES--REMOVE SPACES
	TXNE	T4,JWW.PR	;SEE IF /VERBOS:PREFIX
	PUSHJ	P,.TSIXN##	;YES--ISSUE PREFIX
	POP	P,T3		;GET ADDRESS OF CALL
	TRNE	T3,-1		;SEE IF CALL ADDRESS SET
	TXNN	T4,1_<VRBADX-1>	; AND IF USER ASKED FOR IT
	JRST	ERMSG2		;NO--PROCEED BELOW
	MOVEI	T1,"("		;YES--INDICATE
	PUSHJ	P,.TCHAR##	; ADDRESS
	HRRZ	T1,T3		;GET ADDRESS
	PUSHJ	P,.TOCTW##	; TYPE IN OCTAL
	MOVEI	T1,")"		;GET END
	PUSHJ	P,.TCHAR##	; AND INDICATE
ERMSG2:	PUSHJ	P,.TSPAC##	;SPACE OVER TO TEXT AREA
	HRRZ	T1,(P)		;GET TEXT ADDRESS
	TXNE	T4,JWW.FL	;SEE IF /MESSAGE:FIRST
	PUSHJ	P,.TSTRG##	;YES--ISSUE TEXT
	POP	P,T1		;RESTORE FLAGS (???)
	ANDX	T4,JWW.CN!JWW.FL;REMOVE JUNK BITS
	HRR	T1,T4		;MOVE TO ANSWER
	POPJ	P,		;RETURN
;.VERBO -- ROUTINE TO RETURN /MESSAGE SETTING
;CALL:	PUSHJ	P,.VERBO
;RETURNS T1/BITS IN JWW.?? FORMAT

.VERBO::
IFE FT$TNX,<
	HRROI	T1,.GTWCH	;GET FROM MONITOR
	GETTAB	T1,		;THE USER'S DEFAULT
>
	  MOVEI	T1,0		;(DEFAULT TO 0)
	TXNN	T1,JW.WMS	;SEE IF SET
	TXO	T1,.JWWPO_<ALIGN. (JW.WMS)>  ;NO--DEFAULT TO PREFIX,FIRST
	ANDX	T1,JW.WMS	;REMOVE JUNK
	LSH	T1,^D18-<ALIGN.(JW.WMS)> ;ALIGN IN LEFT HALF
	ANDCM	T1,.FLVRB	;CLEAR ANY SET IN SWITCH
	HLRZS	T1		;POSITION TO RIGHT
	IOR	T1,.FLVRB	;INCLUDE ANY SET IN SWITCH
	TLZ	T1,-1		;CLEAR JUNK
	TRNE	T1,JWW.CN	;SEE IF CONTINUATION
	TRO	T1,JWW.FL	;YES--SET FIRST
	SKIPN	T1		;SEE IF ANYTHING LEFT
	TRO	T1,.JWWPO	;NO--SET FIRST,PREFIX
	POPJ	P,		;RETURN
	RELOC
.VRBOZ::!			;START OF LOW CORE AREA
.FLVRB::BLOCK	1		;MASK,,SET OF /MESSAGE BITS
.FLCBF::BLOCK	1		;FLAG TO CLEAR TYPEAHEAD
.VRBOL==:.-.VRBOZ		;LENGTH OF LOW CORE AREA
	RELOC

	PRGEND
	TITLE	.TNEWL -- ROUTINE TO FORCE OUTPUT TO START OF LINE
	SUBTTL

	SEARCH	SWIDEF,	SWIL		;SWIL PACKAGE DEFINTIONS
	SEARCH	JOBDAT,	MACTEN,	UUOSYM	;STANDARD DEFINITIONS

	SALL				;PRETTY LISTINGS
	.DIREC	FLBLST			;PRETTIER LISTINGS

	TWOSEG	400000			;NICE PURE CODE

;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986,1988.  ALL RIGHTS RESERVED.

	COMMENT	\

COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986,1988.  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.

\
;ENTRY POINTS

	ENTRY	.TNEWL

.TNEWL::PUSHJ	P,.SAVE4##	;SAVE THE P ACS
TNEWL0:	MOVE	P1,[2,,P2]	;TRMOP. ARG POINTER
	MOVEI	P2,.TOSOP	;SKIP IF STILL HAVE OUTPUT
	SETO	P3,		;-1 = US
	TRMOP.	P1,		;ASK MONITOR ABOUT TTY OUTPUT
	 JRST	TNEWL5		;NO OUTPUT PENDING
	MOVEI	P1,0		;OUTPUT PENDING
	SLEEP	P1,		;SLEEP A BIT
	JRST	TNEWL0		;AND CHECK AGAIN

TNEWL5:	MOVE	P1,[2,,P2]	;TRMOP. ARG POINTER
	MOVEI	P2,.TOHPS	;FOR READING HORIZONTAL POSITION
	SETO	P3,-1		;-1 = US
	TRMOP.	P1,		;ASK MONITOR ABOUT "CURSOR" POSITION
	 CAIA			;ASSUME NEED <CR><LF>
	JUMPE	P1,.POPJ##	;IF 0 THEN AT LEFT MARGIN, NO <CR><LF> NEEDED
	PJRST	.TCRLF##	;NOT AT LEFT MARGIN, GET A <CR><LF> OUT
	END