299 lines
3.8 KiB
ArmAsm
299 lines
3.8 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ 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,$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
|
|
|