REM PROGRAM ANNUITY 1.2.2 REM PROGRAMMER D. ALLEN REM CREATED JAN 19, 1984 REM UPDATED JAN 16, 2001 REM COPYRIGHT (C) 1985 ' ' THE PURPOSE OF THIS PROGRAM IS TO CALCULATE ANY VARIABLE OF A ' PAYMENT OR WITHDRAWAL ANNUITY. LOANS OR MORTGAGES CAN ALSO BE ' DETERMINED BY TREATING THEM AS WITHDRAWAL ANNUITIES. ' ' VARIABLE TABLE: ' A,A$ - ONE CHARACTER INPUT ' AMT.! - AMOUNT OF PAYMENT/WITHDRAWAL PER PERIOD ' AMT.INT! - AMOUNT IN INTEREST PER PERIOD ' AMT.PRIN! - AMOUNT OF PRINCIPAL PER PERIOD ' AMT.TOD# - AMOUNT TO DATE ' AVAIL! - AMOUNT AVAILABLE AFTER N PERIODS ' CALC! - CALCULATED VALUE ' D$,D!,D#,D - DUMMY VARIABLES ' ER - ERROR, OR MESSAGE NUMBER ' ERP - ERROR PROCESSING FLAG ' F0$,F1$,F2$ - FORMATS 0, 1, AND 2 ' INT.! - INTEREST RATE PER PERIOD ' INT.MAX! - MAXIMUM INTEREST ' INT.MIN! - MINIMUM INTEREST ' INT.TOD# - INTEREST TO DATE ' MON - CURRENT MONTH ' NUM% - NUM! ROUNDED ' NUM! - NUMBER OF PAYMENT/WITHDRAWAL PERIODS ' PRIN# - ORIGINAL PRINCIPAL AMOUNT ' PRIN.TOD# - PRINCIPAL TO DATE ' PERIOD - CURRENT PERIOD ' QUIT - FLAG, -1=QUIT ' RPT.ROW - REPORT ROW NUMBER ' SEL.FLG - FLAG, SELECTION: 1=PAYMENT, 2=WITHDRAWAL ' YR - CURRENT YEAR ' ' DECLARATIONS ' GOTO INITIALIZATION REM REM UTILITY ROUTINES SECTION. REM ' INPUT.NUMBER: ' ' THE PURPOSE OF THIS ROUTINE IS TO RETRIEVE A VALID VALUE ' FOR THE NUMBER OF PAYMENTS/WITHDRAWAL PERIODS. ' DO PRINT "Number of "; IF SEL.FLG=1 THEN PRINT "Payments "; ELSE PRINT "Withdrawals "; PRINT "(#) = "; LINE INPUT D$ : NUM!=VAL(D$) IF NUM! <=0 THEN ER=3 : GOSUB MESSAGES LOOP UNTIL NUM! > 0 RETURN ' INPUT.PRINCIPAL: ' ' THE PURPOSE OF THIS ROUTINE IS TO RETRIEVE A VALID VALUE ' FOR THE ORIGINAL PRINCIPAL AMOUNT. ' DO PRINT "Principal ($) = "; LINE INPUT D$ : PRIN#=VAL(D$) IF PRIN# <=0 THEN ER=3 : GOSUB MESSAGES LOOP UNTIL PRIN# > 0 RETURN ' INPUT.AVAIL: ' ' THE PURPOSE OF THIS ROUTINE IS TO RETRIEVE A VALID VALUE ' FOR THE TOTAL AMOUNT AVAILABLE AFTER NUM! PERIODS. ' DO PRINT "Available ($) = "; LINE INPUT D$ : AVAIL!=VAL(D$) IF AVAIL! <=0 THEN ER=3 : GOSUB MESSAGES LOOP UNTIL AVAIL! > 0 RETURN ' INPUT.INTEREST: ' ' THE PURPOSE OF THIS ROUTINE IS TO RETRIEVE A VALID VALUE ' FOR THE INTEREST RATE PER PERIOD (%). ' DO PRINT "Interest Rate for 12 Periods (%) = "; LINE INPUT D$ : INT.!=VAL(D$)/12 IF INT.! <=0 THEN ER=3 : GOSUB MESSAGES LOOP UNTIL INT.! > 0 INT.! = INT.!/100 RETURN ' INPUT.AMOUNT: ' ' THE PURPOSE OF THIS ROUTINE IS TO RETRIEVE A VALID VALUE ' FOR THE AMOUNT OF PAYMENT/WITHDRAWAL PER PERIOD. ' DO PRINT "Amount per Period ($) = "; LINE INPUT D$ : AMT.!=VAL(D$) IF AMT.! <=0 THEN ER=3 : GOSUB MESSAGES LOOP UNTIL AMT.! > 0 RETURN ' PRINT.NUMBER: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE VALUE OF THE ' NUMBER OF PAYMENT/WITHDRAWAL PERIODS. ' NUM!=INT(NUM!+.5) PRINT "Number of full periods = "; PRINT USING "######";NUM! RETURN ' PRINT.PRINCIPAL: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE VALUE OF THE ' ORIGINAL PRINCIPAL AMOUNT. ' PRINT "OriginaL principal amount = "; PRINT USING "$$#####,.##";PRIN# RETURN ' PRINT.AVAIL: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE VALUE OF THE ' TOTAL AMOUNT AVAILABLE AFTER NUM! PERIODS. ' PRINT "Amount available after";NUM!;"periods = "; PRINT USING "$$#####,.##";AVAIL! RETURN ' PRINT.INTEREST: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE VALUE OF THE ' INTEREST RATE PER PERIOD. ' PRINT "Interest Rate for 12 periods = "; PRINT USING "#####.##%";100*INT.!*12 RETURN ' PRINT.AMOUNT: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE VALUE OF THE ' AMOUNT OF PAYMENT/WITHDRAWAL PER PERIOD. ' IF SEL.FLG=1 THEN PRINT "Payment "; ELSE PRINT "Withdrawal "; PRINT "for each period = "; PRINT USING "$#####,.##";AMT.! RETURN ' LPRINT.NUMBER: ' ' THE PURPOSE OF THIS ROUTINE IS TO LPRINT THE VALUE OF THE ' NUMBER OF PAYMENT/WITHDRAWAL PERIODS. ' NUM!=INT(NUM!+.5) PRINT #1, "Number of full periods = "; PRINT #1, USING "######";NUM! RETURN ' LPRINT.PRINCIPAL: ' ' THE PURPOSE OF THIS ROUTINE IS TO LPRINT THE VALUE OF THE ' ORIGINAL PRINCIPAL AMOUNT. ' PRINT #1, "OriginaL principal amount = "; PRINT #1, USING "$$#####,.##";PRIN# RETURN ' LPRINT.AVAIL: ' ' THE PURPOSE OF THIS ROUTINE IS TO LPRINT THE VALUE OF THE ' TOTAL AMOUNT AVAILABLE AFTER NUM! PERIODS. ' PRINT #1, "Amount available after";NUM!;"periods = "; PRINT #1, USING "$$#####,.##";AVAIL! RETURN ' LPRINT.INTEREST: ' ' THE PURPOSE OF THIS ROUTINE IS TO LPRINT THE VALUE OF THE ' INTEREST RATE PER PERIOD. ' PRINT #1, "Interest Rate for 12 periods = "; PRINT #1, USING "#####.##%";100*INT.!*12 RETURN ' LPRINT.AMOUNT: ' ' THE PURPOSE OF THIS ROUTINE IS TO LPRINT THE VALUE OF THE ' AMOUNT OF PAYMENT/WITHDRAWAL PER PERIOD. ' IF SEL.FLG=1 THEN PRINT #1, "Payment "; ELSE PRINT #1, "Withdrawal "; PRINT #1, "for each period = "; PRINT #1, USING "$#####,.##";AMT.! RETURN ' CLS.: ' ' THE PURPOSE OF THIS ROUTINE IS TO CLEAR THE SCREEN AND HOME ' THE CURSOR. ' : LOCATE ,,1 : CLS RETURN ' GET.INKEY: ' ' THE PURPOSE OF THIS ROUTINE IS TO SET A$ TO THE NEXT CHARATER ' TYPED BY THE USER. LOWERCASE IS CONVERTED TO UPPERCASE. ' DO A$=INKEY$ LOOP UNTIL A$<>"" A=ASC(A$) : IF A>96 AND A<123 THEN A$=CHR$(A-32) RETURN ' MESSAGES: ' ' THE PURPOSE OF THIS ROUTINE IS TO HANDLE ALL NON-FATAL ' ERROR MESSAGES. ENTRY: GOSUB MESSAGES\ ' D$="" IF ER=1 THEN D$="Invalid Command" IF ER=3 THEN D$="Not Positive" IF ER=4 THEN D$="Available must be >= Amount per Period" IF ER=5 THEN D$="Available must be >= Number*Amount per Period" IF ER=6 THEN D$="Principal must be >= Amount per Period" IF ER=7 THEN D$="Amount per period must be > Pricipal*Interest" IF ER=8 THEN D$="Principal must be <= Number*Amount per Period" PRINT "** ";D$ RETURN ' ERROR.HANDLER: ' ' THE PURPOSE OF THIS ROUTINE IS HANDLE ALL PROGRAM, AND ' SYSTEM ERRORS. ENTRY: ON ERROR GOTO ERROR.HANDLER\ ' D$="" IF ERR<50 THEN D$="Syntax Error" IF ERR=53 THEN D$="File not Found" IF ERR=64 THEN D$="Bad File Name" IF D$="" THEN D$="Disk Error" PRINT "** ";D$;", ERR#";ERR IF ERR <= 50 THEN D!=ERL IF D! <> 65535 THEN PRINT "** Error Line Number";D! END IF IF ERP THEN PRINT "Press 'C' to continue, anything to quit." D$=INPUT$(1) IF D$<>"C" AND D$<>"c" THEN STOP END IF RESUME RESUMED RESUMED: RETURN REM REM UTILITY ROUTINES EXIT. REM ' INITIALIZATION: ' ' THE PURPOSE OF THIS ROUTINE IS TO INITIALIZE ALL SYSTEM ' VARIABLES AND TABLES. ' ON ERROR GOTO ERROR.HANDLER ' WIDTH LPRINT 132 AMT.!=0 AVAIL!=0 IF LEN(ENVIRON$("DEBUG")) > 0 THEN ERP = -1 ELSE ERP = 0 F0$= " " F1$= " ####" F2$= " ########.##" F3$= " $$#####,.##" INT.!=0 NUM!=0 PRIN#=0 REM REM MAIN ROUTINE REM ' ' THE PURPOSE OF THIS ROUTINE IS TO CONTROL THE PROGRAM. THE ' USER IS PROMPTED FOR EITHER A PAYMENT OR A WITHDRAWAL ANNUITY. ' THE USER IS ASKED FOR ALL KNOWN VARIABLES. THE UNKNOWN ' VARIABLE IS COMPUTED AND DISPLAYED. A TABLE OF THE ANNUITY ' CAN THEN BE PRINTED. THE USER MAY PROCESS AS MANY ANNUITIES ' AS DESIRED. ' GOSUB CLS. PRINT "ANNUITY 1.2.2" PRINT "(C) Copyright 1985-2001 by Dennis Allen" PRINT "Portions (C) Copyright" PRINT "Microsoft Corp. 1982-2001" PRINT "All Rights Reserved" PRINT PRINT "This program can be used to calculate any variable of a" PRINT "payment or withdrawal annuity. Loans or mortages can also" PRINT "be determined by treating them withdrawal annuities." PRINT PRINT "Only five variables are used, as follows:" PRINT " N = Number of payment/withdrawal periods" PRINT " P = Original Principal amount" PRINT " A = Total Amount available after N periods" PRINT " I = Interest rate per period (%)" PRINT " R = Amount of payment/withdrawal per period" PRINT PRINT "For a payment annuity, give any three of the variables" PRINT "N, A, I, R, and find the fourth." PRINT PRINT "For a withdrawal annuity, give any three of the variables" PRINT "N, P, I, R, and find the fourth." DO DO PRINT PRINT "Which annuity do you wish (1=Payment, 2=Withdrawal)"; GOSUB GET.INKEY SEL.FLG=VAL(A$) IF SEL.FLG<>1 AND SEL.FLG<>2 THEN ER=1 : GOSUB MESSAGES LOOP UNTIL SEL.FLG=1 OR SEL.FLG=2 ON SEL.FLG GOSUB PAYMENT,WITHDRAWAL PRINT PRINT "Would you like to print the table for this case: "; PRINT "(Y or N)"; GOSUB GET.INKEY IF A$<>"Y" THEN SEL.FLG=0 ON SEL.FLG GOSUB PAYMENT.REPORT,WITHDRAWAL.REPORT PRINT PRINT "Would you like to try another case (Y or N)"; GOSUB GET.INKEY QUIT=0 : IF A$="N" THEN QUIT=-1 LOOP UNTIL QUIT SYSTEM REM REM MAIN ROUTINES SECTION. REM ' PAYMENT: ' ' THE PURPOSE OF THIS ROUTINE IS TO PROCESS A PAYMENT ANNUITY. ' THE USER IS ASKED FOR THE UNKNOWN VARIABLE. THIS ROUTINE ' WILL THEN ASK FOR ALL THE KNOWN VARIABLES. THE UNKNOWN ' VARIABLE IS COMPUTED AND DISPLAYED. THE USER CAN THEN OBTAIN ' A TABLE OF PAYMENTS, INTEREST, AND PRINCIPAL. ENTRY & EXIT: ' THE MAIN ROUTINE. ' GOSUB CLS. PRINT "Payment Annuity" PRINT PRINT " N = Number of payment/withdrawal periods" PRINT " A = Total Amount available after N periods" PRINT " I = Interest rate per period (%)" PRINT " R = Amount of payment/withdrawal per period" DO PRINT PRINT "Which variable is unknown (N,A,I or R)"; GOSUB GET.INKEY A=INSTR("NAIR",A$) IF A=0 THEN ER=1 : GOSUB MESSAGES LOOP UNTIL A<>0 PRINT PRINT "Please type in the required variables as follows:" PRINT ON A GOSUB PAY.NUMBER,PAY.AVAIL,PAY.INTEREST,PAY.AMOUNT D! = AMT.! * (1-(1+INT.!)^-NUM!)/INT.! PRINT PRINT "Present value of payment is = "; PRINT USING "$$#####,.##";D! RETURN REM REM PAYMENT ROUTINES SECTION. REM ' PAY.NUMBER: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' NUMBER OF PAYMENT/WITHDRAWAL PERIODS. ENTRY & EXIT: PAYMENT\ ' DO GOSUB INPUT.AVAIL GOSUB INPUT.INTEREST GOSUB INPUT.AMOUNT IF AVAIL! < AMT.! THEN ER=4 : GOSUB MESSAGES LOOP UNTIL AVAIL! >= AMT.! NUM! = LOG((AVAIL!*INT.!/AMT.!)+1) / LOG(INT.!+1) GOSUB PRINT.NUMBER RETURN ' PAY.AVAIL: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' TOTAL AMOUNT AVAILABLE AFTER NUM! PERIODS. ENTRY & EXIT: ' PAYMENT\ ' GOSUB INPUT.NUMBER GOSUB INPUT.INTEREST GOSUB INPUT.AMOUNT AVAIL! = AMT.!*(((INT.!+1)^NUM!)-1)/INT.! GOSUB PRINT.AVAIL RETURN ' PAY.INTEREST: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' INTEREST RATE PER PERIOD. ENTRY & EXIT: PAYMENT\ ' DO DO GOSUB INPUT.NUMBER GOSUB INPUT.AVAIL GOSUB INPUT.AMOUNT IF AVAIL! < (NUM!*AMT.!) THEN ER=5 : GOSUB MESSAGES LOOP UNTIL AVAIL! >= (NUM!*AMT.!) IF AVAIL! < AMT.! THEN ER=4 : GOSUB MESSAGES LOOP UNTIL AVAIL! >= AMT.! INT.!=.1 : INT.MIN!=0 : INT.MAX!=1 DO CALC!=AMT.!*(((INT.!+1)^NUM!)-1)/INT.! D!=ABS(AVAIL!-CALC!) : D#=ABS(INT.MAX!-INT.MIN!) IF D!<=.01 OR D#<=.01 THEN GOSUB PRINT.INTEREST : RETURN IF CALC! <= AVAIL! THEN INT.MIN!=INT.! : INT.!=(INT.!+INT.MAX!)/2 ELSE INT.MAX!=INT.! : INT.!=(INT.!+INT.MIN!)/2 END IF LOOP RETURN ' PAY.AMOUNT: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' AMOUNT OF PAYMENT PER PERIOD. ENTRY & EXIT: PAYMENT\ ' GOSUB INPUT.NUMBER GOSUB INPUT.AVAIL GOSUB INPUT.INTEREST AMT.! = AVAIL! * INT.! / (((INT.!+1)^NUM!)-1) GOSUB PRINT.AMOUNT RETURN REM REM PAYMENT ROUTINES EXIT. REM ' WITHDRAWAL: ' ' THE PURPOSE OF THIS ROUTINE IS TO PROCESS A WITHDRAWAL ' ANNUITY. THE USER IS ASKED FOR THE UNKNOWN VARIABLE. THIS ' ROUTINE WILL THEN ASK FOR ALL THE KNOWN VARIABLES. THE ' UNKNOWN VARIABLE IS COMPUTED AND DISPLAYED. THE USER CAN THEN ' OBTAIN A TABLE OF WITHDRAWALS, INTEREST, AND PRINCIPAL. ' ENTRY & EXIT: THE MAIN ROUTINE. ' GOSUB CLS. PRINT "Withdrawal Annuity" PRINT PRINT " N = Number of payment/withdrawal periods" PRINT " P = Original Principal amount" PRINT " I = Interest rate per period (%)" PRINT " R = Amount of payment/withdrawal per period" DO PRINT PRINT "Which variable is unknown (N,P,I or R)"; GOSUB GET.INKEY A=INSTR("NPIR",A$) IF A=0 THEN ER=1 : GOSUB MESSAGES LOOP UNTIL A<>0 PRINT PRINT "Please type in the required variables as follows:" PRINT ON A GOSUB WITH.NUMBER,WITH.PRINCIPAL,WITH.INTEREST,WITH.AMOUNT RETURN REM REM WITHDRAWAL ROUTINES SECTION. REM ' WITH.NUMBER: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' NUMBER OF WITHDRAWAL PERIODS. ENTRY & EXIT: WITHDRAWAL\ ' DO DO GOSUB INPUT.PRINCIPAL GOSUB INPUT.INTEREST GOSUB INPUT.AMOUNT IF AMT.! <= PRIN#*INT.! THEN ER=7 : GOSUB MESSAGES LOOP UNTIL AMT.! > PRIN#*INT.! IF PRIN# < AMT.! THEN ER=6 : GOSUB MESSAGES LOOP UNTIL PRIN# >= AMT.! NUM! = LOG(AMT.!/(AMT.!-(PRIN#*INT.!))) / LOG(INT.!+1) GOSUB PRINT.NUMBER RETURN ' WITH.PRINCIPAL: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' ORIGINAL WITHDRAWAL PRINCIPAL. ENTRY & EXIT: WITHDRAWAL\ ' GOSUB INPUT.NUMBER GOSUB INPUT.INTEREST GOSUB INPUT.AMOUNT PRIN# = AMT.!*(((INT.!+1)^NUM!)-1)/ (INT.!*(INT.!+1)^NUM!) GOSUB PRINT.PRINCIPAL RETURN ' WITH.INTEREST: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' INTEREST RATE PER PERIOD. ENTRY & EXIT: WITHDRAWAL\ ' DO GOSUB INPUT.NUMBER GOSUB INPUT.PRINCIPAL GOSUB INPUT.AMOUNT IF PRIN#>(NUM!*AMT.!) THEN ER=8 : GOSUB MESSAGES LOOP UNTIL PRIN# <= (NUM!*AMT.!) INT.!=((AMT.!*NUM!-PRIN#)/NUM!)/PRIN# INT.MIN!=0 : INT.MAX!=1 DO CALC!=AMT.!*((INT.!+1)^NUM!-1)/(INT.!*(1+INT.!)^NUM!) D!=ABS(PRIN#-CALC!) : D#=ABS(INT.MAX!-INT.MIN!) IF D!<=.01 OR D#<=.01 THEN GOSUB PRINT.INTEREST : RETURN IF CALC! > PRIN# THEN INT.MIN!=INT.! : INT.!=(INT.!+INT.MAX!)/2 ELSE INT.MAX!=INT.! : INT.!=(INT.!+INT.MIN!)/2 END IF LOOP RETURN ' WITH.AMOUNT: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE UNKNOWN ' AMOUNT OF WITHDRAWAL PER PERIOD. ENTRY & EXIT: WITHDRAWAL\ ' GOSUB INPUT.NUMBER GOSUB INPUT.PRINCIPAL GOSUB INPUT.INTEREST AMT.! = PRIN#*INT.!*((INT.!+1)^NUM!) / (((INT.!+1)^NUM!)-1) AMT.! = AMT.!+.005 AMT.! = INT(AMT.!*100)/100 GOSUB PRINT.AMOUNT RETURN REM REM WITHDRAWL ROUTINES EXIT. REM ' PAYMENT.REPORT: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE PAYMENT TABLE. ' THIS TABLE INCLUDES THE PERIOD, PAYMENT, INTEREST, AND ' BALANCE. ENTRY & EXIT: PAYMENT\. ' OPEN "LPT1.DOS" FOR OUTPUT AS #1 GOSUB LPRINT.NUMBER GOSUB LPRINT.AVAIL GOSUB LPRINT.INTEREST GOSUB LPRINT.AMOUNT PRINT #1, " " : PRINT #1, " " RPT.ROW=6 : GOSUB PAY.HEADER YR=0 : MON=1 : PERIOD=1 AMT.TOD#=AMT.! INT.TOD#=0 AVAIL!=AMT.! GOSUB PAY.DETAIL MON=MON+1 : PERIOD=PERIOD+1 IF MON=12 THEN MON=0 : YR=YR+1 NUM%=INT(NUM!+.5) WHILE PERIOD <= NUM% AMT.INT!=AVAIL!*INT.! AMT.TOD#=AMT.TOD#+AMT.! INT.TOD#=INT.TOD#+AMT.INT! AVAIL!=AVAIL!+AMT.!+AMT.INT! GOSUB PAY.DETAIL MON=MON+1 : PERIOD=PERIOD+1 IF MON=1 THEN YR=YR+1 IF MON=12 THEN MON=0 WEND GOSUB PAY.FOOTER CLOSE #1 RETURN REM REM PAY REPORT ROUTINES SECTION. REM ' PAY.HEADER: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE PAYMENT REPORT ' HEADER. ' PRINT #1, " Time Monthly Payments Interest Balance" PRINT #1, " Yrs. Mos. Periods Payment to date to date" PRINT #1, " **** **** ******* ******* ******** ******** *******" PRINT #1, " " RPT.ROW=RPT.ROW+4 RETURN ' PAY.DETAIL: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRODUCE THE PAYMENT DETAIL. ' IF RPT.ROW>58 THEN GOSUB PAY.FOOTER : RPT.ROW=1 IF RPT.ROW=1 THEN GOSUB PAY.HEADER IF YR=0 THEN PRINT #1, F0$; ELSE PRINT #1, USING F1$;YR; IF MON=0 THEN PRINT #1, F0$; ELSE PRINT #1, USING F1$;MON; PRINT #1, USING F1$;PERIOD; PRINT #1, USING F2$;AMT.!; PRINT #1, USING F2$;AMT.TOD#; PRINT #1, USING F2$;INT.TOD#; PRINT #1, USING F2$;AVAIL! RPT.ROW=RPT.ROW+1 RETURN ' PAY.FOOTER: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT LINEFEEDS TO THE NEXT ' PAGE. ' ' WHILE RPT.ROW<67 ' LPRINT " " : RPT.ROW=RPT.ROW+1 ' WEND PRINT #1, CHR$(12) RETURN REM REM PAY REPORT ROUTINES EXIT. REM ' WITHDRAWAL.REPORT: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE WITHDRAWAL TABLE. ' THIS TABLE INCLUDES THE PERIOD, INTEREST, AVAILABLE, ' WITHDRAWAL, AND PRINCIPAL. ENTRY & EXIT: THE MAIN ROUTINE. ' OPEN "LPT1.DOS" FOR OUTPUT AS #1 GOSUB LPRINT.NUMBER GOSUB LPRINT.PRINCIPAL GOSUB LPRINT.INTEREST GOSUB LPRINT.AMOUNT PRINT #1, " " : PRINT #1, " " RPT.ROW=6 : GOSUB WITH.HEADER YR=0 : MON=1 : PERIOD=1 AMT.INT!=0 AMT.PRIN!=0 INT.TOD#=0 PRIN.TOD#=0 AMT.TOD#=0 DO AMT.INT!=INT.!*PRIN#+.005 AMT.INT!=INT(AMT.INT!*100)/100 AMT.PRIN!=AMT.!-AMT.INT! INT.TOD#=INT.TOD#+AMT.INT! PRIN.TOD#=PRIN.TOD#+AMT.PRIN! AMT.TOD#=AMT.TOD#+AMT.! PRIN#=PRIN#+AMT.INT!-AMT.! IF PRIN# > 0 THEN GOSUB WITH.DETAIL MON=MON+1 : PERIOD=PERIOD+1 IF MON=1 THEN YR=YR+1 IF MON=12 THEN MON=0 LOOP UNTIL PRIN#<=0 GOSUB WITH.FOOTER CLOSE #1 RETURN REM REM WITH REPORT ROUTINES SECTION. REM ' WITH.HEADER: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE WITHDRAWAL REPORT ' HEADER. ' PRINT #1, " Time Payment on Monthly Interest Principal Payment Balance" PRINT #1, " Yrs. Mos. Periods Interest Principal Payment to date to date to date" PRINT #1, " **** **** ******* ******** ********* ******** ******** ********* ******* *******" PRINT #1, " " RPT.ROW=RPT.ROW+4 RETURN ' WITH.DETAIL: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT THE WITHDRAWAL DETAIL. ' IF RPT.ROW>58 THEN GOSUB WITH.FOOTER : RPT.ROW=1 IF RPT.ROW=1 THEN GOSUB WITH.HEADER IF YR=0 THEN PRINT #1, F0$; ELSE PRINT #1, USING F1$;YR; IF MON=0 THEN PRINT #1, F0$; ELSE PRINT #1,USING F1$;MON; PRINT #1, USING F1$;PERIOD; PRINT #1, USING F2$;AMT.INT!; PRINT #1, USING F2$;AMT.PRIN!; PRINT #1, USING F2$;AMT.!; PRINT #1, USING F2$;INT.TOD#; PRINT #1, USING F2$;PRIN.TOD#; PRINT #1, USING F2$;AMT.TOD#; PRINT #1, USING F2$;PRIN# RPT.ROW=RPT.ROW+1 RETURN ' WITH.FOOTER: ' ' THE PURPOSE OF THIS ROUTINE IS TO PRINT LINEFEEDS TO THE NEXT ' PAGE. ' ' WHILE RPT.ROW<67 ' LPRINT " " : RPT.ROW=RPT.ROW+1 ' WEND PRINT #1, CHR$(12) RETURN REM REM WITHDRAWAL REPORT ROUTINES EXIT. REM REM REM MAIN ROUTINES EXIT. REM END