228 lines
2.5 KiB
ArmAsm
228 lines
2.5 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ f32 -- expression to tree
|
|
|
|
.globl e1
|
|
.globl e2
|
|
.globl e11
|
|
|
|
.globl error
|
|
.globl getsym
|
|
.globl blockp
|
|
.globl blocks
|
|
.globl declimpl
|
|
.globl conu
|
|
.globl ptemp
|
|
.globl functn
|
|
.globl funimpl
|
|
|
|
/ e1: e2[,e1]
|
|
/ e2: e2[.or.e3]
|
|
/ e3: e3[.and.e4]
|
|
/ e4: [.not.]e5
|
|
/ e5: e6[.rel.e6]
|
|
/ e6: [+-]e7[+-e6]
|
|
/ e7: e7[*/e8]
|
|
/ e8: e9[**e9]
|
|
/ e9: constant
|
|
/ name[(e1)]
|
|
/ (e2)
|
|
e1:
|
|
jsr r5,e2
|
|
cmp r0,$36. / ,
|
|
bne 1f
|
|
jsr r5,block; e1
|
|
rts r5
|
|
|
|
e2:
|
|
jsr r5,e3
|
|
2:
|
|
cmp r0,$30. / or
|
|
bne 1f
|
|
jsr r5,block; e3
|
|
br 2b
|
|
|
|
e3:
|
|
jsr r5,e4
|
|
2:
|
|
cmp r0,$28. / and
|
|
bne 1f
|
|
jsr r5,block; e4
|
|
br 2b
|
|
|
|
e4:
|
|
jsr r5,getsym
|
|
cmp r0,$26. / not
|
|
bne e5
|
|
clr r2
|
|
jsr r5,block; e5a
|
|
rts r5
|
|
|
|
e5a:
|
|
jsr r5,getsym
|
|
e5:
|
|
jsr r5,e6
|
|
cmp r0,$14. / .lt.
|
|
blo 1f
|
|
cmp r0,$24. / .ge.
|
|
bhi 1f
|
|
jsr r5,block; e6a
|
|
rts r5
|
|
|
|
e6a:
|
|
jsr r5,getsym
|
|
e6:
|
|
cmp r0,$12. / +
|
|
beq e6a
|
|
cmp r0,$10. / -
|
|
bne 2f
|
|
clr r2
|
|
jsr r5,block; e7a
|
|
br 3f
|
|
2:
|
|
jsr r5,e7
|
|
3:
|
|
cmp r0,$10. / -
|
|
blo 1f
|
|
cmp r0,$12. / +
|
|
bhi 1f
|
|
jsr r5,block; e7a
|
|
br 3b
|
|
|
|
e7a:
|
|
jsr r5,getsym
|
|
e7:
|
|
jsr r5,e8
|
|
2:
|
|
cmp r0,$6. / /
|
|
blo 1f
|
|
cmp r0,$8. / *
|
|
bhi 1f
|
|
jsr r5,block; e8a
|
|
br 2b
|
|
|
|
e8a:
|
|
jsr r5,getsym
|
|
e8:
|
|
jsr r5,e9
|
|
cmp r0,$4 / **
|
|
bne 1f
|
|
jsr r5,block; e9a
|
|
1:
|
|
rts r5
|
|
|
|
e9a:
|
|
jsr r5,getsym
|
|
e9:
|
|
cmp r0,$2 / constant
|
|
beq 3f
|
|
/ (e2)
|
|
cmp r0,$32. / (
|
|
bne 1f
|
|
jsr r5,e2
|
|
br 2f
|
|
e10:
|
|
jsr r5,e1
|
|
2:
|
|
cmp r0,$34. / )
|
|
beq 2f
|
|
jsr r5,error; 29.
|
|
rts r5
|
|
2:
|
|
jsr r5,getsym
|
|
rts r5
|
|
1:
|
|
tst r0
|
|
beq e11
|
|
/ unknown
|
|
jsr r5,error; 30.
|
|
rts r5
|
|
|
|
/ name
|
|
e11:
|
|
mov r3,r2
|
|
jsr r5,getsym
|
|
cmp r0,$32. / (
|
|
bne 1f
|
|
jsr r5,appl
|
|
jsr r5,block; e10
|
|
rts r5
|
|
1:
|
|
mov r2,r3
|
|
mov r0,-(sp)
|
|
jsr r5,declimpl
|
|
mov symtab(r3),r0
|
|
bic $!70,r0
|
|
cmp r0,$30 / class =| funct
|
|
bne 1f
|
|
jsr r5,appl
|
|
mov $42.,r3 / just function name
|
|
br 2f
|
|
1:
|
|
clr r3
|
|
2:
|
|
mov (sp)+,r0
|
|
mov r2,-(sp)
|
|
mov blockp,r2
|
|
add $6,blockp
|
|
mov r3,(r2)
|
|
mov (sp)+,2(r2)
|
|
clr 4(r2)
|
|
rts r5
|
|
|
|
/ number
|
|
3:
|
|
mov blockp,r2
|
|
add $6,blockp
|
|
mov r0,(r2)
|
|
mov r3,2(r2)
|
|
cmpb 2(r2),$5 / const->int
|
|
bne 4f
|
|
movb $1,2(r2)
|
|
4:
|
|
mov r3,temp
|
|
mov conu,4(r2)
|
|
inc conu
|
|
jsr r5,ptemp; 'c; temp; symbuf
|
|
jsr r5,getsym
|
|
rts r5
|
|
|
|
appl:
|
|
clr functn
|
|
bit $70,symtab(r2) / class
|
|
bne 1f
|
|
bis $30,symtab(r2)
|
|
jsr r5,funimpl
|
|
1:
|
|
mov r2,r3
|
|
jsr r5,declimpl
|
|
mov symtab(r2),r0
|
|
bic $!70,r0 / class again
|
|
cmp r0,$20 / array
|
|
beq 1f
|
|
cmp r0,$30 / funct
|
|
beq 2f
|
|
jsr r5,error; 33.
|
|
bic $70,symtab(r2)
|
|
br appl
|
|
1:
|
|
mov $32.,r0
|
|
rts r5
|
|
2:
|
|
mov $34.,r0
|
|
rts r5
|
|
|
|
block:
|
|
mov blockp,r3
|
|
add $6,blockp
|
|
mov r0,(r3)+
|
|
mov r2,(r3)+
|
|
mov r3,-(sp)
|
|
jsr r5,*(r5)+
|
|
mov r2,*(sp)
|
|
mov (sp)+,r2
|
|
sub $4,r2
|
|
rts r5
|
|
|