/ .psect nums PROGRAM NUMS SETLAB NMX ;- ; number processor for s%n builtin opcode. ; ; ;+ AUTO de,s1,res,s2 FUNCTION nums[s,t,n,lab] LET de = nmv[fndstr[t,#2],#0] LET s1 = nmv[fndstr[t,#4],#1] IF n GT #4 LET s2 = nmv[fndstr[t,#6],#1] LET r4 = fndstr[t,#5] mov 1(r4),r0 SELECT case r0 of CASEB #'+ LET res = s1 + s2 BREAK CASEB #'- LET res = s1 - s2 BREAK CASEB #'G IF s1 GT s2 LET res = s1 ELSE LET res = s2 FI BREAK CASEB #'L IF s1 LT s2 LET res = s1 ELSE LET res = s2 FI ESAC ELSE LET res = s1 FI IF de GE #0 AND de le #51. MOV #NUM$,R1 LET R1 = R1 + DE + DE LET (R1) = res ELSE . exstat["I%ERR _N)>>",&s,#0] FI RET FUNCTION nmv[a,fld] ;a-> string (count/text) fld 0=left side, 1 = right side LET r4 = a IFB 1(r4) = #'V OR 1(r4) = #'v IFB 2(r4) GE #'0 AND 2(r4) LE #'9 AND (r4) GE #2 movb 2(r4),r3 sub #'0,r3 br 10$ elseifb 2(r4) his #101 and (r4) ge 2 movb 2(r4),r3 bic #40,r3 sub #<100-9.>,r3 10$: if fld ne #0 let r0 = .num$[r3] else mov r3,r0 fi RET FI ELSEIFB 1(R4) = #'@ IFB 2(r4) GE #'0 AND 2(r4) LE #'9 AND (r4) GE #2 movb 2(r4),r3 sub #'0,r3 br 20$ elseifb 2(r4) his #101 and (r4) ge 2 movb 2(r4),r3 bic #40,r3 sub #<100-9.>,r3 20$: LET r2 = .num$[r3] IF r2 GE #0 AND r2 LE #51. if fld ne #0 let r0 = .num$[r2] else mov r2,r0 fi RET FI FI RET #-32766. ELSE LET r4 = valx[a,#10.] RET r4 FI RET #-32766. .end