/
/

/ fx4 -- get symbol

.globl	getsym
.globl	getid
.globl	lookid
.globl	chrtab

.globl	lookup
.globl	error
.globl	geti
.globl	holround
/ getsym returns the next basic symbol

/ 0	name	(symbol table entry in r3)
/ 2	number	(type in r3)
/ 4	**
/ 6	/
/ 8	*
/ 10	-
/ 12	+
/ 14	.lt.
/ 16	.le.
/ 18	.eq.
/ 20	.ne.
/ 22	.gt.
/ 24	.ge.
/ 26	.not.
/ 28	.and.
/ 30	.or.
/ 32	(
/ 34	)
/ 36	,
/ 38	=
/ 40	=|
/
getsym:
	mov	r2,-(sp)
	mov	r1,r2
	jsr	r5,lookup; bastab
		br 1f
	mov	r2,r1
	cmp	r0,$4
	bhis	2f
	asr	r0
	add	$'0,r0
	movb	r0,symbuf
	movb	$12,symbuf+1
	clrb	symbuf+2
	mov	$logcon,r3		/ logical*2
	mov	$2,r0
2:
	cmp	r0,$32.
	bne	2f

/ check for possible complex constant

	mov	r1,-(sp)
	movb	-2(r1),r0
	movb	chrtab(r0),r0
	beq	4f
	cmp	r0,$4
	blos	3f
4:
	jsr	r5,srconst
		br 3f
	mov	r3,r2
	cmpb	(r1)+,$',
	bne	3f
	jsr	r5,srconst
		br 3f
	cmp	r3,r2
	bhis	4f
	mov	r2,r3
4:
	cmpb	(r1)+,$')
	bne	3f
	mov	(sp)+,r1
	mov	$symbuf,r2
4:
	movb	(r1)+,(r2)
	cmpb	(r2)+,$')
	bne	4b
	clrb	-(r2)
	mov	$2,r0
	br	2f
3:
	mov	(sp)+,r1
	mov	$32.,r0
2:
	mov	(sp)+,r2
	rts	r5
1:
	clr	lstchr
	cmp	r1,$line
	blos	1f
	movb	-1(r1),lstchr
1:
	mov	$symbuf,r2
	movb	(r1)+,r0
	movb	r0,(r2)+
	bic	$!177,r0
	movb	chrtab(r0),r0
	jmp	*1f(r0)
1:
	eos
	let
	num
	per

eos:
	mov	$40.,r0
	tstb	-(r1)
	beq	2b
	jsr	r5,error; 8.
	br	2b

let:
	dec	r1
	jsr	r5,getid
		br .+2		/ cannot happen
	jsr	r5,lookid; symbuf
	mov	(sp)+,r2
	clr	r0
	rts	r5

num:
	mov	$intcon,r3	/ integer*4
	jsr	r5,numst
	cmpb	(r1),$'.
	bne	2f
	mov	r2,-(sp)
	mov	r1,r2
	jsr	r5,lookup; bastab
		br 1f
	mov	(sp)+,r2
	br	3f
1:
	mov	(sp)+,r2
	movb	(r1)+,(r2)+
	br	1f
2:
	cmpb	(r1),$'h		/ hollerith const?
	bne	2f
	mov	lstchr,r0
	cmpb	chrtab(r0),$2		/ letter?
	beq	2f			/ not h, then
	cmp	r0,$'*
	beq	2f			/ e.g. real*4 h...
	clrb	(r2)
	jsr	r5,geti
	mov	$symbuf,r2
	inc	r1
	mov	holround,-(sp)
	dec	(sp)
	clr	-(sp)
4:
	movb	(r1)+,(r2)+
	bne	5f
	jsr	r5,error; 55.
	br	6f
5:
	inc	(sp)
	dec	r0
	bgt	4b
6:
	bit	(sp),2(sp)
	beq	6f
	movb	$' ,(r2)+
	inc	(sp)
	br	6b
6:
	mov	(sp)+,r3
	tst	(sp)+
	swab	r3
	clrb	r3
	bis	$5,r3
	mov	$2,r0
	mov	(sp)+,r2
	rts	r5

.bss
lstchr:	.=.+2
.text

per:
	jsr	r5,isnum
		br eos
1:
	mov	$realcon,r3	/ real*4
	jsr	r5,numst
2:
	jsr	r5,expon
3:
	clrb	(r2)
	mov	$2,r0
	mov	(sp)+,r2
	rts	r5

isnum:
	movb	(r1),r0
	cmpb	chrtab(r0),$4
	bne	1f
	tst	(r5)+
1:
	rts	r5

numst:
	jsr	r5,isnum
		br 1b
	inc	r1
	movb	r0,(r2)+
	br	numst

expon:
	cmpb	(r1)+,$'e
	beq	1f
	cmpb	-1(r1),$'d
	beq	1f
2:
	dec	r1
	rts	r5
1:
	cmpb	(r1),$'+
	beq	1f
	cmpb	(r1),$'-
	beq	1f
	jsr	r5,isnum
		br 2b
1:
	mov	$realcon,r3	/ real*4
	cmpb	-(r1),$'e
	beq	1f
	mov	$dblcon,r3	/ real*8
1:
	movb	(r1)+,(r2)+
	movb	(r1)+,(r2)+
	jsr	r5,numst
	rts	r5

getid:
	mov	r0,-(sp)
	mov	r2,-(sp)
	movb	(r1),r0
	cmpb	chrtab(r0),$2
	bne	3f
	tst	(r5)+
	mov	$symbuf,r2
1:
	movb	(r1)+,r0
	movb	r0,(r2)+
	movb	chrtab(r0),r0
	cmp	r0,$2
	beq	1b
	cmp	r0,$4
	beq	1b
	dec	r1
	clrb	(r2)
	movb	$12,-(r2)
3:
	mov	(sp)+,r2
	mov	(sp)+,r0
	rts	r5

lookid:
	mov	r0,-(sp)
	mov	r2,-(sp)
2:
	mov	(r5),r2
	jsr	r5,lookup; namebuf
		br 1f
	asl	r0
	asl	r0
	mov	r0,r3
	mov	(sp)+,r2
	mov	(sp)+,r0
	tst	(r5)+
	rts	r5
1:
	mov	namep,r0
	add	$8.,symtp
1:
	movb	(r2)+,(r0)+
	bne	1b
	mov	r0,namep
	cmp	r0,$enamebuf
	bhis	1f
	mov	symtp,r0
	add	$symtab,r0
	cmp	r0,esymp
	blo	2b
1:
	mov	$1,r0
	sys	write; ovfl; eovfl-ovfl
	clr	r0
	sys	seek; 0; 2
	mov	$-1,r0
	sys	exit

ovfl:
	<Symbol table overflow\n>
eovfl:
.even

srconst:
	cmpb	(r1)+,$'+
	beq	1f
	cmpb	-(r1),$'-
	bne	1f
	inc	r1
1:
	jsr	r5,getsym
	cmp	r0,$2
	bne	1f
	clrb	r3
	add	r3,r3
	bisb	$cplxcon,r3
	tst	(r5)+
1:
	rts	r5

chrtab:
	.byte	0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,6,0
	.byte	4,4,4,4,4,4,4,4
	.byte	4,4,0,0,0,0,0,0
	.byte	0,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2
	.byte	2,2,2,0,0,0,0,0
	.byte	0,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2
	.byte	2,2,2,0,0,0,0,0

bastab:
	<.false.\0>
	<.true.\0>
	<**\0>
	</\0>
	<*\0>
	<-\0>
	<+\0>
	<.lt.\0>
	<.le.\0>
	<.eq.\0>
	<.ne.\0>
	<.gt.\0>
	<.ge.\0>
	<.not.\0>
	<.and.\0>
	<.or.\0>
	<(\0>
	<)\0>
	<,\0>
	<=\0>
	<\0>

