.TITLE SUM.MAC (VERSION PROVIDED) .MCALL .TTYOUT, .EXIT, .PRINT N = 70. ;NO. OF DIGITS OF 'E' TO CALCULATE ; 'E' = THE SUM OF THE RECIPROCALS OF THE FACTORIALS ; 1/0! + 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + ... .DSABL GBL EXP: .PRINT #MESSAG ;PRINT INTRODUCTORY TEXT MOV #N,R5 ;NO. OF CHARS OF 'E' TO PRINT FIRST: MOV #N+1,R0 ;NO. OF DIGITS OF ACCURACY MOV #A,R1 ;ADDRESS OF DIGIT VECTOR SECOND: ASL @R1 ;DO MULTIPLY BY 10 (DECIMAL) MOV @R1,-(SP) ;SAVE *2 ASL @R1 ;*4 ASL @R1 ;*8 ADD (SP)+,(R1)+ ;NOW *10, POINT TO NEXT DIGIT DEC R0 ;AT END OF DIGITS? BNE SECOND ;BRANCH IF NOT MOV #N,R0 ;GO THRU ALL PLACES, DIVIDING THIRD: MOV -(R1),R3 ;BY THE PLACES INDEX MOV #-1,R2 ;INIT QUOTIENT REGISTER FOURTH: INC R2 ;BUMP QUOTIENT SUB R0,R3 ;SUBTRACT LOOP ISN'T BAD BCC FOURTH ;NUMERATOR IS ALWAYS < 10*N ADD R0,R3 ;FIX REMAINDER MOV R3,@R1 ;SAVE REMAINDER AS BASIS ;FOR NEXT DIGIT ADD R2-2(R1) ;GREATEST INTEGER CARRIES ;TO GIVE DIGIT DEC R0 ;AT END OF DIGIT VECTOR? BNE THIRD ;BRANCH IF NOT MOV -(R1),R0 ;GET DIGIT TO OUTPUT FIFTH: SUB #10.,R0 ;FIX THE 2.7 TO .7 SO ;THAT IT IS ONLY 1 DIGIT BCC FIFTH ;(REALLY DIVIDE BY 10) ADD #10+'0,R0 ;MAKE DIGIT ASCII .TTYON ;OUTPUT THE DIGIT CLR @R1 ;CLEAR NEXT DIGIT LOCATION DEC R5 ;MORE DIGITS TO PRINT? BNE FIRST ;BRANCH IF YES .EXIT ;WE ARE DONE EXP: .REPT N+1 .WORD 1 ;INIT VECTOR TO ALL ONES .ENDR MESSAG: .ASCII /THE VALUE OF E IS:/ <15><12> /2./ <200> .EVEN .END EXP