! ARITHMETIC ROUTINE (SORT OF DOUBLE WORD) !W.S.C. 24TH FEB 1977 !LAST UPDATED 25/03/77 09:45 %CONTROL K'001000' %EXTERNALROUTINE ARITH(%INTEGERNAME N1,N2,%INTEGER BY1,BY2,OP) !N1 & N2 ARE DOUBLE WORD INTEGERS WITH UP TO 100 IN N2, !THE 1000'S IN N1.DITTO BY1 AND BY2.THE RESULT IS PUT !INTO N1 &N2. FOR MPY AND DIV BY1 IS ASSUMED TO BE ZERO. ! OP MAY BE ONE OF THE FOLLOWING VALUES:- %CONSTINTEGER ADD=0 %CONSTINTEGER SUB=1 %CONSTINTEGER MPY=2 %CONSTINTEGER DIV=3 %SWITCH SW(0:3) %INTEGER TEMP,I,BT2,T1,T2,R1,MB,CAR,R2 %ROUTINE AD(%INTEGER B1,B2,%INTEGERNAME M1,M2) %INTEGER TEMP M2=M2+B2 TEMP=M2//1000 M2=M2-(TEMP*1000) M1=M1+B1+TEMP %END %ROUTINE SB(%INTEGER B1,B2) CAR=0 TEMP=0 %IF B2>N2 %START TEMP=B2//1000 %IF N2SW(OP) SW(ADD):AD(BY1,BY2,N1,N2) %RETURN SW(SUB):SB(BY1,BY2) %RETURN SW(MPY):R1=0 R2=0 MB=BY2 %WHILE MB#0 %CYCLE BT2=MB-((MB//10)*10) T2=N2*BT2 T1=N1*BT2 TEMP=T2//1000 T1=T1+TEMP T2=T2-(TEMP*1000) AD(T1,T2,R1,R2) MB=MB//10 N2=N2*10 TEMP=N2//1000 N1=(N1*10)+TEMP N2=N2-(TEMP*1000) %REPEAT N1=R1 N2=R2 %RETURN SW(DIV):%IF BY2=0 %START PRINTSTRING('DIVIDE BY ZERO') NEWLINE %STOP %FINISH %IF BY2>3276 %START BT2=BY2 %WHILE BT2=(BT2//10)*10 %CYCLE BT2=BT2//10 R1=N1-(N1//10)*10 N1=N1//10 N2=(N2+(R1*1000))//10 %REPEAT %RETURN %IF BT2=1 T1=BT2//1000 T2=BT2-(T1*1000) R1=0 R2=0 %WHILE N1>T1 %OR (N1=T1 %AND N2>=T2) %CYCLE AD(0,1,R1,R2) SB(T1,T2) %REPEAT %FINISH %ELSE %START BT2=N2 R1=N1//BY2 R2=0 T2=R1*BY2 N1=N1-T2 I=100 WRITE(R1,5);WRITE(R2,5);WRITE(T2,5);WRITE(I,5);NEWLINE WRITE(N1,5);WRITE(N2,5);WRITE(BY2,5);NEWLINE %WHILE I#0 %CYCLE TEMP=BT2//I WRITE(TEMP,5) T1=(N1*10)+TEMP WRITE(T1,5) T2=T1//BY2 WRITE(T2,5) R2=R2+(T2*I) WRITE(R2,5);NEWLINE N1=T1-(T2*BY2) WRITE(N1,5) BT2=BT2-(TEMP*I) WRITE(BT2,5) I=I//10 WRITE(I,5);NEWLINE %REPEAT %FINISH N1=R1 N2=R2 %END %ENDOFFILE