home *** CD-ROM | disk | FTP | other *** search
- /
- /
-
- / 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
-
-