	.TITLE	SIZE		
; JEFFREY KODOSKY	ARL	NOV75
;
; SUBR
; ENTRY:	1 ARG		<S>
; EXIT:		1 ARG		<INT>
; ERRORS:	G2, RECURSION LIMIT EXCEEDED
; CALLS:	I2ATM
; R2,R3 PRESERVED
	.GLOBL	SIZE,ZSIZE,FSTART,SSTART,QI2ATM,QG2ERR
SIZE:	CLR	-(SP)	;DEPTH COUNTER
	MOV	(R5)+,R0
SIZE01:	BIC	#3,R0
	BEQ	SIZE03	;DON'T MARK NIL
	BIT	#1,@R0	;IS CELL ALREADY MARKED?
	BNE	SIZE03	;JUMP IF SO
	BIT	#2,@R0	;IS IT A NUMBER?
	BNE	SIZE02	;JUMP IF SO
	BIT	@PC,2(R0)	;IS IT A STRING ATOM?
	BNE	SIZE02	;JUMP IF SO
	BIT	#1,2(R0);IS IT A LITATM?
	BNE	SIZE03	;JUMP IF SO (DON'T MARK IT)
	INC	@SP	;ITS A LIST: SAVE CDR
	MOV	2(R0),-(R5)
	CMP	R4,R5
	BHIS	SIZE20	;JUMP IF NO STACK SPACE LEFT
SIZE02:	INC	@R0	;MARK CELL
	MOV	@R0,R0	;LOOP BACK TO MARK CAR
	BR	SIZE01
SIZE03:	DEC	@SP
	BMI	SIZE04
	MOV	(R5)+,R0;LOOP BACK WITH A CDR
	BR	SIZE01
SIZE04:	TST	(SP)+	;POP DEPTH COUNTER
	CLR	R1	;COUNT AND UNMARK CELLS
SIZE05:	MOV	FSTART,R0
SIZE09:	ASR	@R0	;IS CELL MARKED?
	BCC	SIZE10	;JUMP IF NOT
	INC	R1	;OTHERWISE COUNT IT
SIZE10:	ASL	@R0	;AND UNMARK IT
	CMP	(R0)+,(R0)+	;BUMP TO NEXT CELL
	CMP	R0,SSTART
	BLO	SIZE09
	MOV	R1,-(SP);END OF FREE SPACE: MAKE AN INTEGER ATOM
	BPL	.+4	;IF<0 THEN MUST HAVE RUN OUT OF ROOM
	QG2ERR
	QI2ATM
	.WORD	0
SIZE20:	ASL	@SP	;FLUSH STACK
	ADD	(SP)+,R5
	MOV	#100000,R1	;MAKE A NEGATIVE DEFINITE COUNTER
	BR	SIZE05	;JUMP BACK TO UNMARK EVERYTHING AND EXIT
ZSIZE=.-SIZE
	.END
