	.TITLE	PRINT		
; JEFFREY KODOSKY	ARL	NOV75
;
; SUBR:		PRINT, PRIN1
; ENTRY:	1 ARG		<S>
; EXIT:		1 ARG		SAME <S>
; ERRORS:	NONE
; CALLS:	ATM2ASCII
;		GET
;		PRNT
;		ATOM
	.GLOBL	PRINT,ZPRINT,PRIN1,ZPRIN1,QPRNT,QATOM,QATM2A,OUTSYS
	.GLOBL	QPRIN1,RSWVAL,OSWVAL,QGET,APVAL,OSW,RSW,WSW,WSWVAL
	.GLOBL	LASTPR
PRINT:	QPRIN1
	BR	TERP01
ZPRINT=.-PRINT
;
;
; SUBR:		TERPRI, TERMINATE PRINT LINE
; ENTRY:	NO ARGS
; EXIT:		1 ARG		NIL
; ERRORS:	NONE
; CALLS:	PRNT
	.GLOBL	TERPRI,ZTERPRI
TERPRI:	CLR	-(R5)
TERP01:	MOV	#CRLF,R3
	QPRNT
	MOVB	#-1,OUTSYS+1	;RESTORE NORMAL SYSOUT
	JMP	@-(R4)
ZTERPRI=.-TERPRI
;
PRIN1:	MOV	@R5,-(R5)	;COPY TO RETURN
	ROOM	3
	MOV	APVAL,-(R5)
	MOV	RSW,-(R5)
	QGET
	MOV	(R5)+,RSWVAL
	MOV	APVAL,-(R5)
	MOV	OSW,-(R5)
	QGET
	MOV	(R5)+,OSWVAL
	MOV	APVAL,-(R5)
	MOV	WSW,-(R5)
	QGET
	MOV	(R5)+,WSWVAL
PRIN0:	TST	LASTPR
	BNE	PRT00	;DELIMIT PREVIOUS PRINTED
	MOV	#SPC,R3	;OUTPUT IF IT WAS ATOMIC
	QPRNT
PRT00:	ROOM	3
	QATM2ASCII	;ATTEMPT TO CONVERT <ARG> TO ASCII PNAME
	BCS	PRT01	;JUMP IF ITS NON-ATOMIC
	BPL	1$	;JUMP IF NOT A STRING
	TST	RSWVAL
	BNE	.+4
	INC	R3	;NO QUOTES UNLESS LISP READABLE FORMAT
	JSR	PC,STRPRT
	TST	RSWVAL
	BEQ	2$
1$:	QPRNT		;PRINT IT
2$:	CLR	LASTPR
	JMP	@-(R4)
PRT01:	MOV	#LPAR,R3	;NON-ATOMIC: OPEN LIST WITH (
	INC	LASTPR
	QPRNT
PRT02:	MOV	@R5,R0
	MOV	2(R0),@R5	;SAVE REST:=CD...DR[<ARG>]
	MOV	@R0,-(R5)	;IS CAR[<ARG>] NIL?
	BNE	PRT03
	TST	(R5)+	;YES: POP IT AND PRINT ()
	MOV	#LRPAR,R3
	QPRNT
	BR	PRT04
PRT03:	MOV	#PRT04,(R4)+	;NO: FAKE A TRAP TO PRINT CAR
	BR	PRIN0
PRT04:	MOV	(R5)+,R0;NULL[REST]?
	BEQ	PRT05	;YES: PRINT ) AND RETURN
	MOV	-(R5),-(R5)	;NO: COPY IT
	QATOM		;IS REST ATOMIC?
	TST	(R5)+
	BEQ	PRT02	;NO: LOOP BACK FOR NEXT CAR
	MOV	#S.S,R3	;YES: PRINT <SPACE> . <SPACE>
	QPRNT
	QATM2ASCII	;PRINT ATOM
	BPL	1$
	TST	RSWVAL
	BNE	.+4
	INC	R3
	JSR	PC,STRPRT
	TST	RSWVAL
	BEQ	PRT05
1$:	QPRNT
PRT05:	MOV	#RPAR,R3;PRINT )
	INC	LASTPR
	QPRNT
	.WORD	0	;AND RETURN
STRPRT:	MOVB	(R3)+,TEMP	;SEND STRING CHARACTERS ONE AT 
	BEQ	STR1	;A TIME SINCE LINE BOUNDARIES DON'T 
	MOV	R3,-(SP);MATTER FOR STRINGS
	MOV	#TEMP,R3
	QPRNT
	MOV	(SP)+,R3
	BR	STRPRT
STR1:	MOV	#QUOTE,R3
	RTS	PC
LASTPR:	.WORD	1	;ZERO IF LAST PRINTED OBJECT WAS ATOMIC
			;(I.E. DELIMITER REQUIRED WHEN LASTPR=0)
TEMP:	.WORD	0
QUOTE:	.ASCIZ	/'/
CRLF:	.BYTE	15,12,0
LPAR:	.ASCIZ	/(/
LRPAR:	.ASCIZ	/()/
RPAR=.-2
S.S:	.BYTE	240,56	;"MARKED" SPACES (DELETED ON OUTPUT BY
SPC:	.BYTE	240,0	;PRNT IF THEY'RE FIRST ON A NEW LINE)
	.EVEN
ZPRIN1=.-PRIN1
	.END
