/
/

/ f47 -- analysis of data statements

.globl	cdata
.globl	dodata
.globl	onedata
.globl	compare

.globl	code
.globl	getcon
.globl	error
.globl	getsym
.globl	consub
.globl	size
.globl	geti
.globl	setln
.globl	getln
.globl	declimpl
.globl	evalcon
.globl	dattab
.globl	contab
.globl	efno
.globl	perror
.globl	qsort
.globl	negflg
.globl	repfact
.globl	geti
.globl	holround

cdata:
	mov	r5,-(sp)
	jsr	r5,setln
	mov	$dattab,r4
	mov	$contab,r5
dloop:
	jsr	r5,getln
		br 2f
	br	1f
2:
	mov	r4,-(sp)
	mov	$dattab,r1
	mov	r4,r2
	mov	$8.,r3
	jsr	pc,qsort
	mov	(sp)+,r4
	mov	(sp)+,r5
	rts	r5
1:
	cmp	r0,$'d
	bne	dloop
	mov	$line+4,r1
/ loop per specification-set
1:
	clr	repfact
	mov	r1,r2
2:
	jsr	r5,getsym
	cmp	r0,$40.		/ =|
	bne	3f
8:
	jmp	8f
9:
	jmp	9f
3:
	cmp	r0,$6		/ /
	bne	2b
	mov	r1,-(sp)
	mov	r2,r1
	mov	(sp)+,r2
/ loop per specification
2:
	cmp	r4,r5
	blo	3f
	jmp	7f
3:
	jsr	r5,getsym
	tst	r0
	bne	8b
	bit	$70,symtab(r3)		/ test classed
	bne	3f
	jsr	r5,declimpl
3:
	mov	symtab(r3),r0
	mov	r0,holquo		/ temp storage
	incb	holquo+1		/ round size
	bicb	$1,holquo+1
	bit	$200,r0			/ test parameter
	bne	9b
	bic	$!70,r0
	cmp	r0,$10			/ simple
	beq	3f
	cmp	r0,$20			/ array
	bne	9b
3:
	bit	$100,symtab(r3)		/ test common
	beq	3f
	cmp	progt,$6		/ test block data
	bne	9b
	mov	symtab+4(r3),(r4)+	/ common block
	br	4f
3:
	cmp	progt,$6		/ test block data
	beq	9b
	clr	(r4)+
	tst	symtab+6(r3)		/ test allocated
	bne	4f
	mov	nxtaloc,symtab+6(r3)
	jsr	r5,size
	add	r0,nxtaloc
4:
	clr	(r4)			/ offset slot
	cmpb	(r1),$'(		/ test subscript
	bne	3f
	inc	r1
	jsr	r5,consub
	bic	$70,holquo
	bis	$10,holquo	/ array -> scalar
	mov	r0,(r4)
3:
	movb	symtab+1(r3),r0	/ width of item
	inc	r0
	bic	$1,r0
	mov	r0,holround
	add	symtab+6(r3),(r4)+
	tst	repfact
	beq	3f
	dec	repfact
	movb	efno+1,r3
	mov	r3,(r4)+
	mov	r5,(r4)+
	br	4f
3:
	mov	r1,-(sp)
	mov	r2,r1
	mov	(sp)+,r2
5:
	jsr	r5,getsym
	cmp	r0,$12.			/ +
	beq	5b
	cmp	r0,$2			/ constant
	beq	3f
	cmp	r0,$10.			/ -
	bne	8f
	inc	negflg
	jsr	r5,getsym
	cmp	r0,$2			/ constant
	bne	8f
3:
	cmpb	(r1)+,$'*
	bne	3f
	cmp	r3,$intcon
	bne	8f
	jsr	r5,geti
	dec	r0
	bmi	8f
	mov	r0,repfact
	br	5b
3:
	dec	r1
	mov	r1,-(sp)
	mov	r2,-(sp)
	mov	r3,efno
	clrb	r3
	swab	r3
	mov	r3,(r4)+
	sub	r3,r5
	mov	r5,(r4)+		/ ptr to const
	mov	r5,r3
	mov	$symbuf,r1
	jsr	r5,evalcon
	clr	negflg
	mov	(sp)+,r1
	mov	(sp)+,r2		/ note r1 <=> r2
4:
	cmpb	efno+1,holquo+1		/ compare sizes
	blt	9f			/ constant too small
	beq	3f
	bicb	$!77,holquo
	cmp	holquo,$int2con+10	/ simple int*2?
	bne	4f
	sub	$2,-4(r4)		/ reduce const length
	cmpb	efno,$5
	beq	3f			/ hollerith, OK
	add	$2,-2(r4)		/ get least sig.
	br	3f
4:
	bit	$20,holquo		/ test array
	beq	9f
	cmpb	efno,$5			/ test hollerith
	bne	9f
3:
	cmpb	(r1),$'/
	beq	3f
	cmpb	(r1)+,$',
	bne	8f
	tst	repfact
	bne	4f
	cmpb	(r2)+,$',
	bne	8f
4:
	jmp	2b
3:
	cmpb	(r2)+,$'/
	bne	8f
	tstb	(r2)
	beq	1f
	cmpb	(r2),$',
	bne	3f
	inc	r2
3:
	mov	r2,r1
	tst	repfact
	bne	8f
	jmp	1b
7:
	jsr	r5,error; 28.		/ data table overflow
	br	2f
8:
	jsr	r5,error; 21.		/ data syntax error
	br	2f
9:
	jsr	r5,error; 22.		/ data semantic error
2:
	mov	$dattab,r4		/ reset ptrs
	mov	$contab,r5
	jsr	r5,perror
1:
	jmp	dloop

dodata:
	cmp	progt,$6
	beq	1f			/ block data
	mov	$dattab,r3
	cmp	r3,r4
	bne	2f			/ is data
	mov	nxtaloc,r0
	jsr	r5,code
		<.=.+%d.\n.text\n\0>; .even
		r0
	rts	r5
2:
	jsr	r5,onedata
	sub	nxtaloc,r1
	neg	r1
	blt	9b
	jsr	r5,code
		<.=.+%d.\n.text\n\0>; .even
		r1
1:
	rts	r5

onedata:
	clr	r1
2:
	mov	2(r3),r0
	sub	r1,r0
	bmi	9f
	beq	3f
	jsr	r5,code
		<.=.+%d.\n\0>; .even
		r0
	add	r0,r1
3:
	mov	4(r3),r0
	add	r0,r1
	asr	r0
	mov	r0,-(sp)
	mov	6(r3),r2
3:
	mov	(r2)+,r0
	jsr	r5,code
		<%o\n\0>; .even
		r0
	dec	(sp)
	bne	3b
	tst	(sp)+
	add	$8.,r3
	cmp	r3,r4
	bhis	1f
	cmp	(r3),-8(r3)		/ any more in this block
	beq	2b
1:
	rts	r5
9:
	clr	line
	jsr	r5,error; 32.		/ overlapping data init
	jsr	r5,perror
	rts	r5

/ comparison routine for qsort

compare:
	cmp	(r0),(r4)
	bne	1f
	cmp	2(r0),2(r4)
1:
	rts	pc

