Google
 

Trailing-Edge - PDP-10 Archives - BB-H506D-SM_1983 - sort/source/srtcer.mac
There are 10 other files named srtcer.mac in the archive. Click here to see a list.
SUBTTL	SRTCER	- COBOL SORT ERROR ROUTINES
SUBTTL	STOLEN FROM SCAN - D.M.NIXON/DZN	13-Jan-81



;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1975, 1981 BY DIGITAL EQUIPMENT CORPORATION


IFN FTPRINT,<PRINTX [Entering SRTCER.MAC]>
SUBTTL	TABLE OF CONTENTS FOR SRTCER


;                    Table of Contents for SRTCER
;
;
;                             Section                             Page
;
;   1  SRTCER  - COBOL SORT ERROR ROUTINES ......................   1
;   2  TABLE OF CONTENTS FOR SRTCER .............................   2
;   3  DEFINITIONS
;        3.1  Parameters From SCNMAC, etc. ......................   3
;        3.2  Impure Data .......................................   4
;   4  TYPE-OUT ROUTINES
;        4.1  Issue Standard Error Message Prefixes .............   5
;        4.2  Return /MESSAGE: Setting ..........................   6
;        4.3  Type OPEN and LOOKUP/RENAME/ENTER Blocks ..........   7
;        4.4  Directory Block ...................................   8
;        4.5  Masked (Wild) Octal Word in XWD Format ............   9
;        4.6  Disk Blocks, Memory Size ..........................  10
;        4.7  Time of Day in HH:MM:SS Format ....................  11
;        4.8  CRLF, PPN, ']', SIXBIT ............................  12
;        4.9  Octal XWD Format and Signed Octal, Decimal, Radix .  13
;        4.10  ASCIZ String, Character, ' '  ','  ':'  '*' ......  14
;   5  .SAVE4 - SUBROUTINE TO SAVE P1-4 FOR A SUBROUTINE ........  15
SUBTTL	DEFINITIONS -- Parameters From SCNMAC, etc.

IFN FTOPS20,<
;DEFINE BITS USED BY VERBOSITY CHECK

JWW.CN==1B9		;/MESSAGE:CONTINUATION
JWW.FL==1B10		;/MESSAGE:FIRST
JWW.PR==1B11		;/MESSAGE:PREFIX
JW.WMS==JWW.CN+JWW.FL+JWW.PR	;/MESSAGE LEVEL
>
IFE FTOPS20,<
FT$SFD==-1			;SFDS FOR SCAN
>
VRBADX==10			;/MESSAGE:ADDRESS
SUBTTL	DEFINITIONS -- Impure Data

	SEGMENT	IMPURE		;[c20]

.TNEWL==.TCRLF
.FLVRB:	BLOCK	1		;MASK,,SET OF /MESSAGE BITS
.FLCBF:	BLOCK	1		;FLAG TO CLEAR TYPEAHEAD
SUBTTL	TYPE-OUT ROUTINES -- Issue Standard Error Message Prefixes

	SEGMENT	LPURE		;[C20]

;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
	JRST	ERMSG2		;NO
	CLEARO			;YES--CLEAR ^O
	HLRZ	T1,-2(P)	;[137] CLEARO MAY DESTROY T1, T2
	ANDI	T1,177		;[137]   SO BE SAFE
	SETOM	.FLCBF		; INDICATE TO CLEAR TYPE-AHEAD
ERMSG2:	PUSHJ	P,.TNEWL	;GO TO START OF LINE
	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	ERMSG1		;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
ERMSG1:	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
SUBTTL	TYPE-OUT ROUTINES -- Return /MESSAGE: Setting

;CALL:	PUSHJ	P,.VERBO
;RETURNS T1/BITS IN JWW.?? FORMAT

.VERBO:	
IFE FTOPS20,<
	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
>
IFN FTOPS20,<
	MOVX	T1,JW.WMS	;FORCE FULL MESSAGE OUT
>
	POPJ	P,		;RETURN
SUBTTL	TYPE-OUT ROUTINES -- Type OPEN and LOOKUP/RENAME/ENTER Blocks

;CALL:	1/ ADDRESS OF OPEN BLOCK
;	2/ ADDRESS OF EXTENDED LOOKUP/ENTER BLOCK
;	PUSHJ	P,.TOLEB
;USES T1-4

IFE FTOPS20,<
.TOLEB:	MOVE	T4,T2		;MAKE SAFE COPY
	MOVE	T1,.OPDEV(T1)	;[OK] GET DEVICE
	PUSHJ	P,.TSIXN	;ISSUE IT
	PUSHJ	P,.TCOLN	;ISSUE SEPARATOR
	MOVE	T1,.RBNAM(T4)	;[OK] GET FILE NAME
	HLRZ	T2,.RBEXT(T4)	;[OK] GET EXTENSION
	CAIN	T2,'UFD'	;SEE IF UFD
	JUMPG	T1,[PUSHJ P,.TPPNW	;YES--TYPE AS P,PN
		    JRST  .+2]		;PROCEED
	PUSHJ	P,.TSIXN	;ELSE ISSUE IN SIXBIT
	MOVEI	T1,"."		;INDICATE EXTENSION
	PUSHJ	P,.TCHAR	;ISSUE IT
	HLLZ	T1,.RBEXT(T4)	;[OK] GET EXTENSION
	PUSHJ	P,.TSIXN	;ISSUE THAT
	MOVEI	T1,.RBPPN(T4)	;[OK] POINT TO DIRECTORY
	PJRST	.TDIRB		;GO TYPE THAT AND RETURN
SUBTTL	TYPE-OUT ROUTINES -- Directory Block

;STILL IN IFE FTOPS20
;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
;USES T1-4

.TDIRB:	
  IFE FT$SFD,<
	SKIPE	T1,(T1)		;[OK] SEE IF SOMETHING
	PJRST	.TPPNW		;YES--PRINT IT
	POPJ	P,
  >
  IFN FT$SFD,<
	MOVE	T4,T1		;SAVE POINTER
	SKIPN	T1,(T4)		;[OK] SEE IF SOMETHING THERE
	JRST	[HLRZ T2,T4	;NO--SEE IF BIWORDS
		 CAIN T2,2	; ..
		 SKIPN 2(T4)	;[OK] YES--SEE IF SOMETHING LATER ON
		 POPJ	P,	;NO--RETURN
		 JRST TDIRB1]	;PROCEED WITH OUTPUT
	TLNE	T4,-1		;SEE IF STRAIGHT
	JRST	TDIRB1		;NOPE--DO IT THE HARD WAY
	TLNE	T1,-1		;YES--SEE IF SFD
	PJRST	.TPPNW		;NO--JUST UFD
	MOVEI	T4,2(T1)	;[OK] YES--CHANGE POINTER

TDIRB1:	HLRZ	T1,T4		;GET LENGTH
	SUBI	T1,2		;SET FLAG -1 FOR SINGLE, 0 FOR BIWORDS
	PUSH	P,T1		;SAVE FOR LATER TESTING
	HRLI	T4,-.FXLND	;SET LENGTH
	MOVEI	T1,"["		;OUTPUT BREAK
	PUSHJ	P,.TCHAR	; ..
	HRRZ	T1,T4		;[C20] GET UFD
	MOVE	T1,(T1)		;[C20]   ..
	JUMPL	T1,[PUSHJ P,.TSIXN
		    JRST  TDIRB2]
	SKIPL	(P)		;SEE IF DOUBLE
	JRST	[HRRZ  T2,T4	;[C20] YES--GET MASK
		 MOVE  T2,1(T2)	;[C20]   ..
		 PUSHJ P,.TXWWW	;OUTPUT MASKED OCTAL XWD
		 JRST  TDIRB2]	;AND PROCEED
	PUSHJ	P,.TXWDW	;TYPE IT
TDIRB2:	AOBJP	T4,TDIRB3	;LOOP UNTIL DONE
	SKIPL	(P)		;IF BIWORDS,
	AOS	T4		;  MOVE UP ONE EXTRA
	HRRZ	T1,T4		;[C20]  ..
	SKIPN	(T1)		;[C20]  ..
	JRST	TDIRB3		;YES--RETURN TYPING LAST BREAK
	PUSHJ	P,.TCOMA	;TYPE A COMMA
	HRRZ	T1,T4		;[C20] GET SFD NAME
	MOVE	T1,(T1)		;[C20]   ..
	PUSHJ	P,.TSIXN	;TYPE IT
	JRST	TDIRB2		; AND LOOP UNTIL DONE
TDIRB3:	POP	P,(P)		;THROW AWAY FLAG
	JRST	.TRBRK		;AND FINISH UP
  >
SUBTTL	TYPE-OUT ROUTINES -- Masked (Wild) Octal Word in XWD Format

;STILL IN IFE FTOPS20
;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

>;END IFE FTOPS20
SUBTTL	TYPE-OUT ROUTINES -- Disk Blocks, Memory Size

;.TCORW -- TYPE NUMBER IN CORE SIZE
;CALL:	1/ SIZE TO TYPE
;	PUSHJ	P,.TBLOK/.TCORW
;USES T1-4

REPEAT 0,<
.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
IFE FTOPS20,<
	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:	HRRZ	T2,T4		;[C20] YES--DIVIDE BY UNITS
	IDIVI	T1,1(T2)	;[C20]   ..
	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
SUBTTL	TYPE-OUT ROUTINES -- Time of Day in HH:MM:SS Format

IFN FTOPS20!FTCOBOL!FTFORTRAN,<
;CALL:	MOVEI	T1,TIME IS MILLISEC SINCE MIDNIGHT
;	PUSHJ	P,.TTIME
;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.

.TTIME:	IDIV	T1,[^D3600000]	;[C20] GET HOURS
	MOVE	T4,T2		;SAVE REST
	MOVEI	T2," "		;FILL WITH SPACE
	PUSHJ	P,.TDEC2	;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
	MOVE	T1,T2		;[C20] CONVERT DIGIT
	ADDI	T1,"0"		;[C20]   ..
	PJRST	.TCHAR		;OUTPUT IT AND RETURN
>;END IFN FTOPS20!FTCOBOL!FTFORTRAN
SUBTTL	TYPE-OUT ROUTINES -- CRLF, PPN, ']', SIXBIT

;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

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

.TPPNW:	PUSH	P,T1		;SAVE ARGUMENT
	MOVEI	T1,"["
	PUSHJ	P,.TCHAR
	POP	P,T1		;RECOVER ARGUMENT
	JUMPL	T1,[PUSHJ P,.TSIXN
		    JRST  .TRBRK]
	PUSHJ	P,.TXWDW	;TYPE XWD
>
.TRBRK:	MOVEI	T1,"]"
	PJRST	.TCHAR

;.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		; ..
SUBTTL	TYPE-OUT ROUTINES -- Octal XWD Format and Signed Octal, Decimal, Radix

;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		;[C20] SAVE REMAINDER
	SKIPE	T1		;SEE IF ANYTHING LEFT
	PUSHJ	P,TRDXW1	;YES--LOOP BACK WITH PD LIST
	POP	P,T1		;[C20] GET BACK A DIGIT
	ADDI	T1,"0"		;CONVERT TO ASCII
	CAILE	T1,"9"		;SEE IF OVERFLOW DIGITS
	ADDI	T1,"A"-"9"	;YES--SWITCH TO ALPHABETICS
	PJRST	.TCHAR		;TYPE IT AND RETURN
SUBTTL	TYPE-OUT ROUTINES -- ASCIZ String, Character, ' '  ','  ':'  '*'

;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
TSTRG1:	ILDB	T1,(P)		;GET NEXT CHARACTER
	JUMPE	T1,TPOPJ	;RETURN WHEN DONE
	PUSHJ	P,.TCHAR	;OUTPUT CHARACTER
	JRST	TSTRG1		;LOOP UNTIL DONE


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

;.TSPAC -- TYPE ASCII SPACE
;.TTABC -- TYPE ASCII TAB
;.TCOMA -- TYPE ASCII COMMA
;.TCOLN -- TYPE ASCII COLON
;.TASTR -- TYPE ASCII ASTERISK
;CALL:	PUSHJ	P,.TXXXX
;USES T1

IFE FTOPS20,<
.TASTR:	MOVEI	T1,"*"		;GET ASTERISK
	PJRST	.TCHAR		;ISSUE AND RETURN
>
.TCOLN:	MOVEI	T1,":"		;GET COLON
	PJRST	.TCHAR		;ISSUE AND RETURN
.TCOMA:	MOVEI	T1,","		;GET COMMA
	PJRST	.TCHAR		;ISSUE AND RETURN
REPEAT 0,<
.TTABC:	MOVEI	T1,.CHTAB	;GET TAB
	PJRST	.TCHAR		;ISSUE AND RETURN
>

.TSPAC:	MOVEI	T1," "		;GET SPACE
.TCHAR:	TRNN	T1,177		;SEE IF NULL
	POPJ	P,		;YES--IGNORE
	TYPEC	(T1)		;LET MONITOR DO IT
	POPJ	P,		;AND RETURN
SUBTTL	.SAVE4 - SUBROUTINE TO SAVE P1-4 FOR A SUBROUTINE

;CALL:	PUSHJ	P,.SAVE4
;RETURN POPJ OR .POPJ1, RESTORES P1-4 AND SKIPS OR NOT

IFE FTCOBOL,<
.SAVE4:	EXCH	P1,(P)		;SAVE P1, GET CALLER PC
	PUSH	P,P2		;SAVE P2
	PUSH	P,P3		;SAVE P3
	PUSH	P,P4		;SAVE P4
	PUSH	P,		;[C20] MAKE SPACE FOR RETURN PC
	PUSH	P,P1		;[C20] SAVE CALLER PC
	XMOVEI	P1,.SAVX4	;[C20] SAVE RETURN PC
	MOVEM	P1,-1(P)	;[C20]   ..
	MOVE	P1,-5(P)	;[C20] RESTORE P1
	POPJ	P,		;[C20] RETURN TO CALLER
.SAVX4:	  SOS	-4(P)		;NON-SKIP RETURN, COMPENSATE .POPJ1

RET4:	POP	P,P4		;RESTORE P4
RET3:	POP	P,P3		;RESTORE P3
RET2:	POP	P,P2		;RESTORE P2
RET1:	POP	P,P1		;RESTORE P1
>
.POPJ1:	AOS	(P)		;INCREMENT PC
.POPJ:	POPJ	P,		;RETURN