/ / / f36 -- expression code generation .globl lvalue .globl rvalue .globl convrt .globl type .globl funcappl .globl name .globl error .globl lookup .globl code .globl iserror .globl genop .globl typ .globl newline .globl functn .globl size lvalue: jsr r5,iserror rts r5 tst (r2) bne 1f mov 2(r2),r3 jsr r5,code < lval>; .even br name 1: mov r2,-(sp) cmp (r2),$32. / array appl bne 1f jsr r5,aryappl dec r0 bne 2f / dim =| 1 tstb symtab(r3) blt 2f / p-bit, not simple mov $"al,r0 br simpary 2: jsr r5,code < alval\0>; .even arydope: jsr r5,pbit mov symtab+2(r3),r2 mov (r2)+,r0 asl r0 add r0,r2 mov (r2),r0 jsr r5,code <; d%d\0>; .even r0 br 2f 1: jsr r5,error; 54. mov (sp)+,r2 rts r5 simpary: mov r3,-(sp) mov symtab(r3),r3 bis $7,r3 jsr r5,genop mov (sp)+,r3 jsr r5,size jsr r5,code <; %d.\0>; .even r0 br 2f name: mov r2,-(sp) jsr r5,pbit 2: jsr r5,code <; \0>; .even bit $100,symtab(r3) / common beq 1f mov symtab+4(r3),r2 jsr r5,code <%n+\0>; .even r2 1: movb symtab(r3),r2 bic $!70,r2 cmp r2,$30 / external bne 1f jsr r5,code <%n.\n\0>; .even r3 br 2f 1: jsr r5,code <%n_\n\0>; .even r3 2: mov symtab(r3),r3 mov (sp)+,r2 rts r5 rvalue: jsr r5,iserror rts r5 mov r2,-(sp) tst (r2) bne 1f mov 2(r2),r3 movb symtab+1(r3),r2 jsr r5,code < rval%d>; .even r2 mov (sp)+,r2 br name 1: cmp (r2),$32. bne 1f jsr r5,aryappl dec r0 bne 3f tstb symtab(r3) blt 3f mov $"ar,r0 br simpary 3: jsr r5,code < arval\0>; .even br arydope 1: cmp (r2),$34. / array appl bne 1f jsr r5,funcappl mov (sp)+,r2 mov 2(r2),r3 movb symtab+1(r3),r0 jsr r5,code <%d.\n\0>; .even r0 mov symtab(r3),r3 rts r5 1: cmp (r2),$2 bne 1f movb 3(r2),r3 mov 4(r2),r2 jsr r5,code < rval%d; c%d\n\0>; .even r3 r2 mov (sp)+,r2 mov 2(r2),r3 rts r5 1: cmp (r2),$24. / arith or relat bhi 1f mov 2(r2),r2 bne 3f mov (sp),r2 sub $10.,(r2) / - bin -> - unary mov 4(r2),r2 jsr r5,rvalue br 2f 3: jsr r5,rvalue mov (sp),r2 mov r3,-(sp) mov 4(r2),r2 jsr r5,type cmp *2(sp),$4 / ** bne 3f mov r3,r2 bic $!7,r2 cmp r2,$1 / ** integer bne 3f mov 2(sp),r2 sub $2,(r2) / pr -> pi mov 4(r2),r2 jsr r5,rvalue mov $intcon,r2 jsr r5,convrt mov (sp)+,r3 br 2f 3: mov (sp),r2 jsr pc,maxtyp mov (sp)+,r3 mov r2,-(sp) jsr r5,convrt mov 2(sp),r2 mov 4(r2),r2 jsr r5,rvalue mov (sp)+,r2 jsr r5,convrt mov r2,r3 br 2f 1: cmp (r2),$30. / and or not bhi 1f mov 2(r2),r2 beq 3f jsr r5,rvalue mov $logcon,r2 jsr r5,convrt 3: mov (sp),r2 mov 4(r2),r2 jsr r5,rvalue mov $logcon,r2 jsr r5,convrt 2: mov (sp)+,r2 mov (r2),r0 cmp r0,$4 bhis 2f add $10.,(r2) / back to binary tst r0 beq 2f sub $8,(r2) / back to pr 2: mov optab(r0),r0 jsr r5,genop jsr r5,newline cmp (r2),$14. / relat blo 2f mov $logcon,r3 2: rts r5 1: jsr r5,error; 54. mov (sp)+,r2 rts r5 pbit: tstb symtab(r3) bge 1f jsr r5,code
1:
rts r5
funcappl:
mov r2,-(sp)
mov functn,r3
jsr r5,code
< stsp; ft+%d.\n\0>; .even
r3
mov r3,-(sp)
add $2,r3
mov r3,functn
clr -(sp) / nargs
1:
mov 4(r2),r2
beq 2f
inc (sp)
cmp (r2),$36. / ,
bne 1f
mov r2,-(sp)
mov 2(r2),r2
mov 6(sp),r3
jsr r5,fapp1
mov (sp)+,r2
br 1b
1:
mov 4(sp),r3
jsr r5,fapp1
2:
mov (sp)+,r0 / nargs
mov (sp)+,r2
mov (sp)+,r3
mov 2(r3),r3
jsr r5,code
< call\0>; .even
jsr r5,pbit
jsr r5,code
<; %n.; ft+%d.; %d.; \0>; .even
r3
r2
r0
cmp functn,functm
ble 1f
mov functn,functm
1:
mov r2,functn
rts r5
fapp1:
mov 2(r3),r3 / fetch out function name
mov symtab+2(r3),r3 / arg conversion
bne 2f
tst (r2)
beq 1f
cmp (r2),$32.
beq 4f
cmp (r2),$42. / lv if funct or name or arry app
beq 1f
cmp (r2),$2 / lv if const
bne 2f
mov 4(r2),r3
jsr r5,code
< lval; c%d\n\0>
r3
br 3f
2:
mov r3,-(sp)
jsr r5,rvalue
mov (sp)+,r2
beq 2f
jsr r5,convrt
2:
mov functn,r3
jsr r5,code
< stsp; ft+%d.\n\0>; .even
r3
add $2,functn
rts r5
1:
clr (r2) / turn func/array names into lvs
4:
jsr r5,lvalue
3:
mov functn,r3
jsr r5,code
< stst; ft+%d.\n\0>; .even
r3
add $2,functn
rts r5
aryappl:
mov r2,-(sp)
clr -(sp) / arg count
2:
inc (sp)
mov 4(r2),r2
cmp (r2),$36. / ,
bne 2f
mov r2,-(sp)
mov 2(r2),r2
jsr r5,rvalue
mov $intcon,r2
jsr r5,convrt
mov (sp)+,r2
br 2b
2:
jsr r5,rvalue
mov $intcon,r2
jsr r5,convrt
mov (sp)+,r0
mov (sp)+,r2
mov 2(r2),r3
cmp r0,*symtab+2(r3)
beq 1f
jsr r5,error; 53. / dimension mismatch
1:
rts r5
/ converts stack from type in r3 to type in r2
convrt:
mov r2,-(sp)
mov r3,-(sp)
bic $![377\<8+7],r2
bic $![377\<8+7],r3
cmp r2,r3
beq 1f
jsr r5,code
< \0>; .even
jsr pc,2f
mov r2,r3
jsr pc,2f
jsr r5,code
<\n\0>; .even
1:
mov (sp)+,r3
mov (sp)+,r2
rts r5
2:
mov r2,-(sp)
mov r3,r2
clrb r3
swab r3
bic $!7,r2
movb typ(r2),r2
jsr r5,code
<%c%d\0>; .even
r2
r3
mov (sp)+,r2
rts pc
type:
cmp (r2),$32.
beq 2f
cmp (r2),$34.
beq 2f
tst (r2)
bne 1f
2:
mov 2(r2),r3
mov symtab(r3),r3
rts r5
1:
cmp (r2),$2
bne 1f
mov 2(r2),r3
rts r5
1:
cmp (r2),$14.
blo 1f
mov $logcon,r3
rts r5
1:
mov r2,-(sp)
mov 2(r2),r2
bne 1f
mov (sp),r2
mov 4(r2),r2
jsr r5,type
br 2f
1:
jsr r5,type
mov (sp),r2
mov r3,-(sp)
mov 4(r2),r2
jsr r5,type
mov (sp)+,r2
jsr pc,maxtyp
mov r2,r3
2:
mov (sp)+,r2
rts r5
maxtyp:
mov r2,r0
cmp r2,r3
bhis 2f
mov r3,r2
2:
clrb r2
bic $!7,r0
bic $!7,r3
cmp r0,r3
bhis 2f
mov r3,r0
2:
bis r0,r2
rts pc
optab: