78 lines
1.0 KiB
ArmAsm
78 lines
1.0 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ fxh -- array constant offset
|
|
|
|
.globl consub
|
|
|
|
.globl getsym
|
|
.globl geti
|
|
.globl error
|
|
.globl geticon
|
|
|
|
/ turn constant subscripts into offset.
|
|
/ in: r3 -> symtab
|
|
/ r1 -> just beyond (
|
|
/ out:r0 has offset
|
|
|
|
consub:
|
|
mov symtab(r3),r0
|
|
bic $!70,r0
|
|
cmp r0,$20 / test class == array
|
|
beq 1f
|
|
jsr r5,error; 17.
|
|
clr r0
|
|
rts r5
|
|
1:
|
|
mov r5,-(sp)
|
|
mov r4,-(sp)
|
|
mov r3,-(sp)
|
|
mov r2,-(sp)
|
|
clr r4 / accumulated offset
|
|
mov symtab+2(r3),r2 / ptr to declarator
|
|
mov (r2)+,-(sp) / dimensionality
|
|
mov $1,r5 / prod of declarators
|
|
1:
|
|
jsr r5,geticon
|
|
br 9f
|
|
cmp r0,(r2)
|
|
bgt 3f
|
|
dec r0
|
|
bge 2f
|
|
3:
|
|
jsr r5,error; 19. / out of range
|
|
clr r0
|
|
2:
|
|
mov r5,-(sp)
|
|
mpy r0,r5
|
|
add r5,r4
|
|
mov (sp)+,r5
|
|
mpy (r2)+,r5
|
|
jsr r5,getsym
|
|
cmp r0,$36. / comma
|
|
bne 1f
|
|
dec (sp)
|
|
bgt 1b
|
|
jsr r5,error; 18. / wrong subscript count
|
|
br 1b
|
|
1:
|
|
cmp r0,$34. / )
|
|
beq 1f
|
|
9:
|
|
jsr r5,error; 20.
|
|
clr r0
|
|
1:
|
|
cmp (sp)+,$1
|
|
beq 1f
|
|
jsr r5,error; 18. / subscript count
|
|
1:
|
|
mov (sp)+,r2
|
|
mov (sp)+,r3
|
|
movb symtab+1(r3),r5
|
|
mpy r4,r5
|
|
mov r5,r0
|
|
mov (sp)+,r4
|
|
mov (sp)+,r5
|
|
rts r5
|
|
|