1000 REM LOAN CALCULATION PROGRAM (WRITTEN TO RUN WITH BASIC-80 v5.21)
1020 REM WRITTEN BY MARK MCKIBBEN, WOLD COMMUNICATIONS
1040 REM THIS PROGRAM WAS WRITTEN IN STAGES AND NEVER REALLY STRAIGHTENED
1060 REM OUT, SO IT IS A BIT OF A MESS.
1080 REM THE PROGRAM IS MENU-DRIVEN AND MORE OR LESS SELF-DOCUMENTING.
1100 REM ONLY ONE STATEMENT NEEDS TO BE CORRECTED (IF RUN UNDER MBASIC)
1120 REM FOR SPECIFIC TERMINALS: ONE OF THE FIRST STATEMENTS BELOW
1140 REM DEFINES CLS$, WHICH IS SENT TO THE CONSOLE TO CLEAR SCREEN AND
1160 REM HOME CURSOR.
1180 REM THERE IS ONE UNDOCUMENTED MENU ITEM: "L", WHICH LOADS SAMPLE
1200 REM VALUES INTO THE VARIABLES FOR TESTING.
1220 REM
1240 DEFDBL D:DEFSNG S:DEFSTR A-C:DEFINT I:REM GLOBAL VARIABLE DEFINITIONS
1260 REM CHANGE THE STATMENT BELOW FOR YOUR CLEAR SCREEN SEQUENCE
1280 CLEAR
1300 CLS$=CHR$(27)+CHR$(42):REM THIS VARIABLE WILL CLEAR THE SCREEN
1320 ON ERROR GOTO 1360
1340 GOTO 1480
1360 PRINT CLS$
1380 PRINT:PRINT:PRINT:PRINT " AN ENTRY HAS BEEN MADE WHICH CANNOT BE USED FOR LOAN CALCULATIONS.":PRINT:PRINT
1400 PRINT " PLEASE DOUBLE CHECK YOUR ENTRIES AND TRY AGAIN. PRESS ANY KEY TO CONTINUE. ";
1420 ANS$=INPUT$(1)
1440 RESUME 1280
1460 REM
1480 WIDTH 79:REM SET WIDTH TO 79 ON SCREEN
1500 REM
1520 GOTO 2660
1540 REM MENU PROCESSING SUBROUTINE
1560 PRINT
1580 PRINT " >>>>>>>>>>>>> NOW WAITING FOR YOUR SELECTION >>>>> ";
1600 ANS$=INPUT$(1)
1620 IF ANS$<"a" OR ANS$>"z" THEN GOTO 1660
1640 ANS$=CHR$(ASC(ANS$)-32)
1660 FOR MENUNUM%=1 TO LEN(MENULIST$)
1680 IF ANS$=MID$(MENULIST$,MENUNUM%,1) THEN PRINT ANS$;CHR$(13);SPC(70);CHR$(13);:RETURN
1700 NEXT
1720 GOTO 1600
1740 REM ***** YES/NO SUBROUTINE ****** (MENUNUM% = 1 FOR YES, 2 FOR NO)
1760 ANS$ = INPUT$(1)
1780 IF ANS$ = "Y" OR ANS$ = "y" THEN MENUNUM% = 1 : PRINT "Yes" : RETURN
1800 IF ANS$ = "N" OR ANS$ = "n" THEN MENUNUM% = 2 : PRINT "No" : RETURN
1820 GOTO 1760
1840 REM ******* SUBROUTINE FOR PRINTING REUSED MESSAGE #1
1860 PRINT:PRINT " The calculated amount above will be automatically recalculated anytime you":PRINT " change one of the VARIABLES. Use the menu to select.":RETURN
1880 REM ******* SUBROUTINE FOR PRINTING REUSED MESSAGE #2
1900 PRINT " Please enter each missing variable using the menu to select each item.":RETURN
1920 REM ******* SUBROUTINE FOR PRINTING REUSED MESSAGE #3
1940 PRINT:PRINT " Variables needed for calculation:":PRINT:PRINT " VARIABLE CURRENT VALUE":RETURN
1960 REM ******* SUBROUTINE FOR PRINTING REUSED MESSAGE #4
1980 PRINT:PRINT " PRESS (H) for HELP."
2000 PRINT " PRESS (M) to return to the MAIN MENU.":RETURN
2020 REM ****** SUBROUTINE FOR PRINTING REUSED MESSAGE #5
2040 PRINT " NEGATIVE numbers are not allowed in loan calculations. HIT ANY KEY.";ANS$=INPUT$(1);
2060 PRINT CHR$(13);SPC(75);CHR$(13);
2080 RETURN
2100 REM ORIGINAL TERM LOAN PRINICIPAL USING INTEREST RATE, THE AMOUNT
2120 REM OF REGULAR PAYMENTS, NUMBER OF PAYMENTS PER YEAR AND TERM OF THE
2140 REM LOAN.
2160 REM
2180 REM REGULAR PAYMENT ON A LOAN USING ORIGINAL LOAN PRINCIPAL, INTEREST
2200 REM RATE, NUMBER OF PAYMENTS PER YEAR, AND NUMBER OF YEARS TO PAY.
2220 REM ASSUMES ALL PAYMENTS WILL BE EQUAL.
2240 REM
2260 REM LAST PAYMENT ON A LOAN USING AMOUNT OF THE LOAN, THE AMOUNT OF
2280 REM THE PAYMENTS, INTEREST RATE CHARGED, NUMBER OF PAYMENTS PER YEAR
2300 REM AND THE TERM OF THE PAYMENTS
2320 REM
2340 REM REMAINING BALANCE ON A LOAN AFTER A SPECIFIC NUMBER OF PAYMENTS
2360 REM USING PAYMENT AMOUNT, NUMBER OF PAYMENTS PER YEAR, AMOUNT OF THE
2380 REM PRINCIPAL, ANNUAL INTEREST RATE, AND THE PAYMENTS NUMBER. THERE
2400 REM ALSO A SUBROUTINE THAT WILL CALCULATE THE PAYMENT NUMBER GIVEN
2420 REM THE FIRST PAYMENT DATE AND THE CURRENT OR PROJECTED DATE.
2440 REM
2460 REM TERM OF A LOAN (PERIOD NEEDED TO REPAY) USING PAYMENT AMOUNTS,
2480 REM NUMBER OF PAYMENTS, ANNUAL INTEREST RATE AND ORIGINAL LOAN AMOUNT.
2500 REM ALL PAYMENTS ARE ASSUMED TO BE EQUAL.
2520 REM
2540 REM ANNUAL INTEREST RATE ON A LOAN USING AMOUNT OF LOAN, AMOUNT OF
2560 REM PAYMENT, NUMBER OF PAYMENTS PER YEAR, AND TERM OF LOAN.
2580 REM
2600 REM MORTGAGE AMORTIZATION TABLE USING PAYMENT AMOUNT, TERM OF PAYMENT
2620 REM NUMBER OF PAYMENTS PER YEAR, PRINCIPAL AMOUNT AND INTEREST RATE.
2640 REM
2660 REM ****************************************************************
2680 REM BEGINNING OF PROGRAM
2700 REM ***************************************************************
2720 REM FIRST COMES THE STARTUP MENU
2740 REM
2760 PRINT CLS$
2780 REM
2800 REM
2820 PRINT:PRINT" *************** MAIN MENU ***************"
2840 PRINT " This is a program for LOAN CALCULATIONS. Please select the "
2860 PRINT " module you would like to run below."
2880 PRINT
2900 PRINT " (Press the corresponding letter from the menu.)"
2920 PRINT
2940 PRINT " (A) LOAN PRINCIPAL AMOUNT"
2960 PRINT " (B) REGULAR LOAN PAYMENT AMOUNT"
2980 PRINT " (C) LAST PAYMENT ON A LOAN"
3000 PRINT " (D) REMAINING BALANCE ON A LOAN"
3020 PRINT " (E) TERM OF A LOAN"
3040 PRINT " (F) ANNUAL INTEREST RATE ON A LOAN"
3060 PRINT " (G) LOAN AMORTIZATION TABLE"
3080 PRINT
3100 PRINT " (H)ELP-- Choose this for an explanation of the modules above."
3120 PRINT
3140 PRINT " (X) EXIT BACK TO THE OPERATING SYSTEM"
3160 REM
3180 MENULIST$="ABCDEFGHXL"
3200 GOSUB 1540
3220 ON MENUNUM% GOTO 3240,4380,4960,5660,6600,7440,8180,13240,15580,15880
3240 REM *******************MENU CHOICE A*****************************
3260 PRINT CLS$;
3280 PRINT " PRINCIPAL ON A LOAN "
3300 PRINT " Calculates an initial amount borrowed."
3320 GOSUB 1920
3340 PRINT " (A) ";:GOSUB 3360:GOTO 3400
3360 PRINT "Amount of Regular Payment: ";
3380 PRINT USING "$$#########.##";DPAYMENT:RETURN
3400 PRINT " (B) ";:GOSUB 3420:GOTO 3480
3420 PRINT "Annual Interest rate: ";
3440 PRINT USING " ###.##";SINTEREST;
3460 PRINT "%":RETURN
3480 PRINT " (C) ";:GOSUB 3500:GOTO 3540
3500 PRINT "Payments per Year: ";
3520 PRINT USING " ###";IPAYMENTNUM:RETURN
3540 PRINT " (D) ";:GOSUB 3560:GOTO 3600
3560 PRINT "Number of Years: ";
3580 PRINT USING " ###.#";SYEARS:RETURN
3600 PRINT:PRINT
3620 IF (DPAYMENT*SINTEREST*IPAYMENTNUM*SYEARS)<>0 THEN GOSUB 4180 ELSE LET DPRINCIPAL=0
3640 IF DPRINCIPAL=0 THEN GOTO 3720
3660 PRINT " The calculated PRINCIPAL amount is: ";
3680 PRINT USING "$$###########.##";DPRINCIPAL
3700 GOSUB 1840:GOTO 3740
3720 GOSUB 1880
3740 GOSUB 1960
3760 MENULIST$="MABCDH"
3780 GOSUB 1540
3800 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
3820 ON MENUNUM% GOSUB 3860,3940,4020,4100,13360
3840 GOTO 3240
3860 REM ************************** ROUTINE TO GET DPAYMENT ***
3880 INPUT " Please enter the amount of regular payment.... ",DPAYMENT
3900 IF DPAYMENT<0 THEN GOSUB 2020:GOTO 3880
3920 RETURN
3940 REM ************************** ROUTINE TO GET SINTEREST ***
3960 INPUT " Please enter the annual interest rate.... ",SINTEREST
3980 IF SINTEREST<0 THEN GOSUB 2020:GOTO 3960
4000 RETURN
4020 REM ************************** ROUTINE TO GET IPAYMENTNUM ***
4040 INPUT " Please enter the number of payments per year.... ",IPAYMENTNUM
4060 IF IPAYMENTNUM<0 THEN GOSUB 2020:GOTO 4040
4080 RETURN
4100 REM ************************** ROUTINE TO GET SYEARS ***
4120 INPUT " Please enter the term of the loan in years.... ",SYEARS
4140 IF SYEARS<0 THEN GOSUB 2020:GOTO 4120
4160 RETURN
4180 REM ************************** ROUTINE TO CALCULATE PRINCIPAL *******
4960 REM *******************MENU CHOICE C*****************************
4980 PRINT CLS$;
5000 PRINT " LAST PAYMENT ON A LOAN"
5020 PRINT " Finds the final payment at the end of the term."
5040 GOSUB 1920
5060 PRINT " (A) ";:GOSUB 3360
5080 PRINT " (B) ";:GOSUB 4520
5100 PRINT " (C) ";:GOSUB 3560
5120 PRINT " (D) ";:GOSUB 3420
5140 PRINT " (E) ";:GOSUB 3500
5160 PRINT:PRINT
5180 IF (DPAYMENT*DPRINCIPAL*SYEARS*SINTEREST*IPAYMENTNUM)<>0 THEN GOSUB 5400 ELSE LET DLASTPAYMENT=0
5200 IF DLASTPAYMENT=0 THEN GOTO 5280
5220 PRINT " The calculated LAST PAYMENT amount is: ";
5240 PRINT USING "$$#############.##";DLASTPAYMENT
5260 GOSUB 1840:GOSUB 1960:GOTO 5300
5280 GOSUB 1880:GOSUB 1960
5300 MENULIST$="MABCDEH"
5320 GOSUB 1540
5340 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
5360 ON MENUNUM% GOSUB 3860,4300,4100,3940,4020,13980
5380 GOTO 4960
5400 REM ************************* CALCULATION OF DLASTPAYMENT ***
5420 PRINT " Please wait. This calculation can take quite a while to run.";
5440 DBO=DPRINCIPAL
5460 SI=((SINTEREST/100)/IPAYMENTNUM)*100
5480 IJ2=IPAYMENTNUM*SYEARS
5500 FOR IJ1=1 TO IJ2
5520 IF DBO<0 THEN PRINT CHR$(13);SPC(75);CHR$(13);" The payment entered is too large. Press any key to RECALCULATE. ";:ANS$=INPUT$(1):GOSUB 4860:GOTO 4960
5540 DBO=DBO-DPAYMENT+INT(DBO*SI+.5)*.01
5560 NEXT IJ1
5580 TEMPSTORE=INT((DPAYMENT+DBO)*100+.5)/100
5600 DLASTPAYMENT=TEMPSTORE
5620 PRINT CHR$(13);SPC(70);CHR$(13);
5640 RETURN
5660 REM *******************MENU CHOICE D*****************************
5680 PRINT CLS$;
5700 PRINT " REMAINING BALANCE ON A LOAN"
5720 PRINT " Finds the balance after a specified number of payments."
5740 GOSUB 1920
5760 PRINT " (A) ";:GOSUB 3360
5780 PRINT " (B) ";:GOSUB 4520
5800 PRINT " (C) ";:GOSUB 3500
5820 PRINT " (D) ";:GOSUB 3420
5840 PRINT " (E) ";:GOSUB 5900
5860 PRINT " --- ";:GOSUB 3560
5880 GOTO 5980
5900 PRINT "Last Payment made (#,year):";
5920 PRINT USING " ###";SLSTPAYMENT;
5940 PRINT ",";SLSTPAYMENTYEAR
5960 RETURN
5980 PRINT:PRINT
6000 IF (DPAYMENT*DPRINCIPAL*IPAYMENTNUM*SINTEREST*SLSTPAYMENT*SLSTPAYMENTYEAR)<>0 THEN GOSUB 6360 ELSE LET DREMAINING=0:GOTO 6080
6020 PRINT " The calculated REMAINING BALANCE amount is: ";
6040 PRINT USING "$$#############.##";DREMAINING
6060 GOSUB 1840:GOSUB 1960:GOTO 6100
6080 GOSUB 1880:GOSUB 1960
6100 MENULIST$="MABCDEH"
6120 GOSUB 1540
6140 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
6160 ON MENUNUM% GOSUB 3860,4300,4020,3940,6200,14260
6180 GOTO 5660
6200 REM ********************** ROUTINE TO GET SLSTPAYMENT & SLSTPAYMENTYEAR ***
6220 INPUT " Enter the number of the last payment made for this year.... ",SLSTPAYMENT
6240 IF SLSTPAYMENT<0 THEN GOSUB 2020:GOTO 6220
6260 IF SLSTPAYMENT>IPAYMENTNUM THEN PRINT CHR$(7);:PRINT " This value cannot be greater than the number of payments per year. ":GOTO 6220
6280 INPUT " Now enter the year number to calculate remaining balance.... ",SLSTPAYMENTYEAR
6300 IF SLSTPAYMENTYEAR<0 THEN GOSUB 2020:GOTO 6280
6320 IF SLSTPAYMENTYEAR>SYEARS THEN PRINT CHR$(7);:PRINT " This value cannot be greater than the loan term. ":GOTO 6280
6340 RETURN
6360 REM ******************* ROUTINE TO CALCULATE DREMAINING ***
6380 PRINT " Please wait. This calculation can take quite a while to run.";
8020 IF SINTEREST>=25.9 THEN PRINT CHR$(13);SPC(70);CHR$(13);:PRINT:PRINT:PRINT " The calculated INTEREST rate is in excess of 25%. This program cannot":PRINT " determine the exact rate. Press any key to return to the MAIN MENU. ";
8040 IF SINTEREST>=25.9 THEN ANS$=INPUT$(1):SINTEREST=25.5:GOTO 2720
8060 IF (DR1-DPAYMENT)<.02 AND (DR1-DPAYMENT)>-.02 THEN PRINT CHR$(13);SPC(70);CHR$(13);:RETURN
8080 IF DR1>DPAYMENT THEN 8140
8100 SINTEREST=SINTEREST+DI3
8120 GOTO 7940
8140 SINTEREST=SINTEREST-DI3
8160 GOTO 7940
8180 REM *******************MENU CHOICE G*****************************
10420 IF IDISPLAY=1 OR SCURRENTYEAR<ISTART THEN RETURN
10440 PRINT USING " #### ";SJ1;
10460 IF PRINTER=0 THEN GOTO 10500
10480 LPRINT USING " #### ";SJ1;
10500 PRINT USING "$$###########.##";DI3;
10520 IF PRINTER=0 THEN GOTO 10560
10540 LPRINT USING "$$###########.##";DI3;
10560 PRINT USING "$$#############.##";DBI;
10580 IF PRINTER=0 THEN GOTO 10620
10600 LPRINT USING "$$#############.##";DBI;
10620 PRINT USING " $$#############.##";DBO
10640 IF PRINTER=0 THEN GOTO 10700
10660 LPRINT USING " $$#############.##";DBO
10680 LET SLCOUNTER=SLCOUNTER+1
10700 SCOUNTER=SCOUNTER+1
10720 RETURN
10740 REM --- ******************** SCREEN DISPLAY PAUSE ROUTINE
10760 ITEMPSTORE=22-SCOUNTER
10780 FOR ICOUNT=1 TO ITEMPSTORE
10800 PRINT
10820 NEXT ICOUNT
10840 PRINT "DISPLAY HAS BEEN PAUSED. SELECT: (D)ISABLE PAUSE, (C)ONTINUE, OR (A)BORT."
10860 SCOUNTER=0
10880 MENULIST$="CAD"
10900 GOSUB 1540
10920 IF MENUNUM%<>2 THEN GOSUB 10060
10940 RETURN
10960 REM - SUBROUTINE TO SET UP PRINTER AND CHECK TO SEE IF IT'S READY
10980 PRINT
11000 PRINT " NOW CHECKING TO SEE IF THE PRINTER IS READY TO ACCEPT PRINTOUT."
11020 PRINT
11040 PRINT "PRINTER IS NOT READY.... PLEASE CHECK IT. PROCESSING CANNOT CONTINUE.";:LPRINT CHR$(13);
11060 PRINT CHR$(13);SPC(70);
11080 PRINT:PRINT " THE PRINTER IS NOW READY..... HERE WE GO!"
11100 FOR HI=1 TO 300
11120 NEXT HI
11140 PRINT CLS$:PRINT:PRINT
11160 PRINT "WHEN ENTERING THE ITEMS BELOW, DO NOT USE COMMAS. PRESS RETURN WHEN DONE.":PRINT
11180 PRINT " PRESS THE RETURN TO LEAVE AN ENTRY WITHOUT CHANGING IT.":PRINT:PRINT
11200 PRINT " (These entries are for the title block on the printout only.":PRINT " You may enter anything you like, but there must be something entered.)":PRINT
11220 PRINT " Enter a title for this report..... ";:PRINT LABEL$;:PRINT CHR$(13);:PRINT " Enter a title for this report..... ";:INPUT "",LABEL1$
11240 IF LABEL1$="" THEN GOTO 11260 ELSE LABEL$=LABEL1$
11260 PRINT:PRINT " Enter today's date..... ";:PRINT DATE$;:PRINT CHR$(13);:PRINT " Enter today's date..... ";:INPUT "",DATE1$
11280 IF DATE1$="" THEN GOTO 11300 ELSE DATE$=DATE1$
11300 PRINT:PRINT " Enter the name of the recipient of this report... ";:PRINT PERSON$;:PRINT CHR$(13);:PRINT " Enter the name of the recipient of this report... ";:INPUT "",PERSON1$
11320 IF PERSON1$="" THEN GOTO 11340 ELSE PERSON$=PERSON1$
11340 PRINT:PRINT " Are the above entries correct? (Y or N) ";:GOSUB 1740:ON MENUNUM% GOTO 11360,11140
11360 REM
11380 LPRINT:PRINT CLS$:PRINT:PRINT:PRINT " NOW SENDING TITLE BLOCK TO PRINTER.... PLEASE STAND BY."
11400 LPRINT " ";LABEL$
11420 LPRINT:LPRINT " ";" prepared for: ";PERSON$;" on ";DATE$
11440 LPRINT:GOSUB 12460:SLCOUNTER=11
11460 RETURN
11480 REM
11500 ITEMPSTORE=22-SCOUNTER
11520 FOR ICOUNT=1 TO ITEMPSTORE
11540 PRINT
11560 NEXT ICOUNT
11580 IF PRINTER=1 THEN GOSUB 12940
11600 PRINT " PRESS (Y) TO RETURN TO MENU."
11620 MENULIST$="Y"
11640 GOSUB 1540
11660 REM
11680 GOTO 8180
11700 STOP
11720 REM
11740 REM
11760 REM
11780 REM - SUBROUTINE FOR PRINTING YEARLY TOTALS
11800 IF SCURRENTYEAR<ISTART THEN GOTO 12060
11820 IF SCOUNTER>=21 AND MENUNUM%<>3 THEN GOSUB 10740
11840 IF PRINTER=1 THEN GOSUB 12760
11860 IF SCOUNTER>=21 AND MENUNUM%=3 THEN GOSUB 12100
11880 IF IDISPLAY<>1 THEN PRINT:SCOUNTER=SCOUNTER+1
11900 PRINT "*YEAR:";
11920 PRINT USING "###";SCURRENTYEAR;
11940 PRINT USING "$$###########.##";DINTYEAR;
11960 PRINT USING " $$###########.##";DPRINYEAR;
11980 PRINT USING " $$#############.##";DBO
12000 SCOUNTER=SCOUNTER+1
12020 IF SCOUNTER<21 AND IDISPLAY<>1 THEN PRINT:SCOUNTER=SCOUNTER+1
12040 IF SJ1<>SJ2 AND SCOUNTER<21 THEN PRINT:SCOUNTER=SCOUNTER+1
12060 DINTYEAR=0:DPRINYEAR=0
12080 RETURN
12100 REM ******************** ROUTINE TO DISABLE SCREEN PAUSE ***********