121 lines
1.9 KiB
ArmAsm
121 lines
1.9 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ f23 -- do equivalence statements
|
|
|
|
.globl equiv
|
|
|
|
.globl getsym
|
|
.globl consub
|
|
.globl eqvtab
|
|
.globl error
|
|
.globl declimpl
|
|
.globl perror
|
|
.globl setln
|
|
.globl getln
|
|
|
|
/ equivalence statements, part 1
|
|
/ destroys all registers
|
|
|
|
equiv:
|
|
jsr r5,setln
|
|
1:
|
|
jsr r5,getln
|
|
rts r5
|
|
cmp r0,$'e
|
|
bne 1b
|
|
mov $line+11.,r1
|
|
mov r5,-(sp)
|
|
2: / start equivalence group
|
|
cmpb (r1)+,$'( / check (
|
|
bne 9f / syntax error
|
|
jsr r5,getsym
|
|
tst r0
|
|
bne 9f / not identifier
|
|
mov r3,r5
|
|
jsr r5,equset
|
|
movb (r1)+,r2
|
|
clr r4 / offset
|
|
cmp r2,$',
|
|
beq 3f
|
|
cmp r2,$'( / subscripted vble
|
|
bne 9f / syntax error
|
|
jsr r5,consub / get subscript
|
|
mov r0,r4
|
|
cmpb (r1)+,$',
|
|
bne 9f
|
|
3: / rest of group
|
|
jsr r5,getsym / next ident
|
|
tst r0
|
|
bne 9f / syntax
|
|
jsr r5,equset
|
|
clr r0
|
|
mov r3,r2
|
|
cmpb (r1),$'( / subscript?
|
|
bne 4f
|
|
inc r1
|
|
jsr r5,consub
|
|
4:
|
|
mov eqvtab+2(r2),r2
|
|
cmp r2,r5
|
|
beq 5f / already in same group
|
|
cmp r2,r3
|
|
bne 4b / not yet in different group
|
|
sub r4,r0 / adjust offsets
|
|
sub eqvtab+4(r5),r0 / left vble's offset
|
|
add eqvtab+4(r3),r0 / new vble's offset
|
|
4:
|
|
sub r0,eqvtab+4(r2)
|
|
mov eqvtab+2(r2),r2
|
|
cmp r2,r3
|
|
bne 4b
|
|
mov eqvtab+2(r3),r0 / link up groups
|
|
mov eqvtab+2(r5),eqvtab+2(r3)
|
|
mov r0,eqvtab+2(r5) / link groups
|
|
br 6f
|
|
5: / here already in same group
|
|
cmp r0,r4 / offset must be same
|
|
beq 6f
|
|
jsr r5,error; 23. / inconsistency!
|
|
6:
|
|
movb (r1)+,r0
|
|
cmp r0,$',
|
|
beq 3b
|
|
cmp r0,$')
|
|
bne 9f
|
|
movb (r1)+,r0
|
|
bne 3f
|
|
jsr r5,perror
|
|
mov (sp)+,r5
|
|
br 1b
|
|
3:
|
|
cmp r0,$',
|
|
beq 2b
|
|
9:
|
|
jsr r5,error; 24. / equivalence syntax
|
|
jsr r5,perror
|
|
mov (sp)+,r5
|
|
br 1b
|
|
|
|
/ initialize member of equivalence group
|
|
|
|
equset:
|
|
jsr r5,declimpl / declare if necessary
|
|
mov symtab(r3),r0
|
|
bit $200,r0 / test parameter
|
|
bne 2f
|
|
bic $!70,r0
|
|
cmp r0,$10 / simple
|
|
beq 1f
|
|
cmp r0,$20 / array
|
|
beq 1f
|
|
2:
|
|
jsr r5,error; 31. / non-equivalencable variable
|
|
1:
|
|
tst eqvtab+2(r3) / see if mentioned yet
|
|
bne 1f
|
|
mov r3,eqvtab+2(r3) / points to itself
|
|
1:
|
|
rts r5
|
|
|