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 *******
4200 REM
4220 REM
4240 DTEMPSTORE=DPAYMENT*IPAYMENTNUM*(1-1/((SINTEREST/100)/IPAYMENTNUM+1)^(IPAYMENTNUM*SYEARS))/(SINTEREST/100)
4260 DPRINCIPAL=INT(DTEMPSTORE*100+.5)/100
4280 RETURN
4300 REM ************************** ROUTINE TO GET DPRINCIPAL ***
4320 INPUT " Please enter the loan principal.... ",DPRINCIPAL
4340 IF DPRINCIPAL<0 THEN GOSUB 2020:GOTO 4320
4360 RETURN
4380 REM *******************MENU CHOICE B*****************************
4400 PRINT CLS$;
4420 PRINT "          REGULAR PAYMENT"
4440 PRINT "    Calculates the amount of each payment."
4460 GOSUB 1920
4480 PRINT " (A) ";:GOSUB 3420
4500 PRINT " (B) ";:GOSUB 4520:GOTO 4560
4520 PRINT "Amount of Principal:       ";
4540 PRINT USING "$$#########.##";DPRINCIPAL:RETURN
4560 PRINT " (C) ";:GOSUB 3500
4580 PRINT " (D) ";:GOSUB 3560
4600 PRINT:PRINT
4620 IF (SINTEREST*DPRINCIPAL*IPAYMENTNUM*SYEARS)<>0 THEN GOSUB 4860 ELSE LET DPAYMENT=0
4640 IF DPAYMENT=0 THEN GOTO 4720
4660 PRINT " The calculated PAYMENT amount is: ";
4680 PRINT USING "$$############.##";DPAYMENT
4700 GOSUB 1840:GOTO 4740
4720 GOSUB 1880
4740 GOSUB 1960
4760 MENULIST$="MABCDH"
4780 GOSUB 1540
4800 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
4820 ON MENUNUM% GOSUB 3940,4300,4020,4100,13760
4840 GOTO 4380
4860 REM ************************** ROUTINE TO CALCULATE DPAYMENT ***
4880 DTEMPSTORE=((SINTEREST/100)*DPRINCIPAL/IPAYMENTNUM)/(1-1/((SINTEREST/100)/IPAYMENTNUM+1)^(IPAYMENTNUM*SYEARS))
4900 DPAYMENT=INT(DTEMPSTORE*100+.5)/100
4920 RETURN
4940 STOP
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.";
6400 DBO=DPRINCIPAL
6420 SI=SINTEREST/100
6440 SJ2=IPAYMENTNUM*(SLSTPAYMENTYEAR-1)+SLSTPAYMENT
6460 SI2=(SI/IPAYMENTNUM)*100
6480 FOR SJ1=1 TO SJ2
6500 DBO=DBO-DPAYMENT+INT(DBO*SI2+.5)*.01
6520 NEXT SJ1
6540 DREMAINING=INT(DBO*100+.5)/100
6560 PRINT CHR$(13);SPC(75);CHR$(13);
6580 RETURN
6600 REM *******************MENU CHOICE E*****************************
6620 PRINT CLS$;
6640 PRINT "           TERM OF A LOAN"
6660 PRINT "   Finds the period of time needed to repay."
6680 GOSUB 1920
6700 PRINT " (A) ";:GOSUB 3360
6720 PRINT " (B) ";:GOSUB 4520
6740 PRINT " (C) ";:GOSUB 3420
6760 PRINT " (D) ";:GOSUB 3500
6780 PRINT:PRINT
6800 IF (DPAYMENT*DPRINCIPAL*SINTEREST*IPAYMENTNUM)<>0 THEN GOSUB 7040 ELSE LET SYEARS=0:GOTO 6900
6820 PRINT " The calculated TERM OF LOAN is: ";
6840 PRINT USING "####.#";SYEARS;
6860 PRINT " years"
6880 GOSUB 1840:GOSUB 1960:GOTO 6920
6900 GOSUB 1880:GOSUB 1960
6920 MENULIST$="MABCDH"
6940 GOSUB 1540
6960 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
6980 ON MENUNUM% GOSUB 3860,4300,3940,4020,14520
7000 GOTO 6600
7020 STOP
7040 REM ********************** ROUTINE TO CALCULATE SYEARS ***
7060 DTEMPSTORE=DPAYMENT-(DPRINCIPAL*((SINTEREST*.01)/IPAYMENTNUM))
7080 IF DTEMPSTORE<0 THEN 7160
7100 SYEAR1=-(LOG(1-(DPRINCIPAL*(SINTEREST/100))/(IPAYMENTNUM*DPAYMENT))/(LOG(1+SINTEREST/100/IPAYMENTNUM)*IPAYMENTNUM))
7120 SYEARS=INT(SYEAR1*10+.5)/10
7140 RETURN
7160 REM --- COMPLAIN IF PAYMENT WILL NOT AMORTIZE LOAN
7180 PRINT CLS$:PRINT:PRINT:PRINT:PRINT
7200 DPAYMENT=(INT((DPRINCIPAL*((SINTEREST*.01)/IPAYMENTNUM))*100+.5)*.01)+.01
7220 PRINT "                           WARNING"
7240 PRINT " THE PAYMENT ENTERED IS NOT SUFFICIENT TO AMORTIZE THIS LOAN."
7260 PRINT " THE MINIMUM PAYMENT NEEDED HAS BEEN CALCULATED AND ENTERED"
7280 PRINT " FOR YOU.  IT IS: "; 
7300 PRINT USING "$$###########.##";DPAYMENT
7320 PRINT
7340 PRINT " USE THE MAIN MENU IF YOU WANT TO CALCULATE A DIFFERENT AMOUNT."
7360 PRINT
7380 PRINT "          PRESS ANY KEY TO CONTINUE....... ";
7400 ANS$=INPUT$(1)
7420 GOTO 6600
7440 REM *******************MENU CHOICE F*****************************
7460 PRINT CLS$
7480 PRINT "                ANNUAL INTEREST RATE"
7500 PRINT "   Finds the interest rate on a specific loan."
7520 GOSUB 1920
7540 PRINT " (A) ";:GOSUB 3360
7560 PRINT " (B) ";:GOSUB 3560
7580 PRINT " (C) ";:GOSUB 4520
7600 PRINT " (D) ";:GOSUB 3500
7620 PRINT:PRINT
7640 IF (DPAYMENT*SYEARS*DPRINCIPAL*IPAYMENTNUM)<>0 THEN GOSUB 7860 ELSE LET SINTEREST=0:GOTO 7740
7660 PRINT " The calculated INTEREST RATE is: ";
7680 PRINT USING "   ###.##";SINTEREST;
7700 PRINT "%"
7720 GOSUB 1840:GOSUB 1960:GOTO 7760
7740 GOSUB 1880:GOSUB 1960
7760 MENULIST$="MABCDH"
7780 GOSUB 1540
7800 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
7820 ON MENUNUM% GOSUB 3860,4100,4300,4020,14760
7840 GOTO 7440
7860 REM *******************  ROUTINE TO CALCULATE SINTEREST ***
7880 SINTEREST=13
7900 PRINT " Please wait.  This calculation can take a while to run.";
7920 SI2=0
7940 DR1=(SINTEREST*.01*DPRINCIPAL/IPAYMENTNUM)/(1-1/((SINTEREST*.01/IPAYMENTNUM+1)^(IPAYMENTNUM*SYEARS)))
7960 DR1=INT(DR1*100+.5)/100
7980 DI3=ABS(SINTEREST-SI2)/2
8000 SI2=SINTEREST
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*****************************
8200 IF PRINTER=1 THEN LPRINT CHR$(12):PRINTER=0
8220 TEST=0:DINTTOTAL=0:DPRINTOTAL=0:DINTYEAR=0:DPRINYEAR=0
8240 PRINT CLS$
8260 PRINT "      LOAN AMORTIZATION TABLE"
8280 PRINT "  Provides complete loan progress chart."
8300 GOSUB 1920
8320 PRINT " (A) ";:GOSUB 3360
8340 PRINT " (B) ";:GOSUB 3560
8360 PRINT " (C) ";:GOSUB 4520
8380 PRINT " (D) ";:GOSUB 3420
8400 PRINT " --- ";:GOSUB 3500
8420 REM
8440 PRINT:PRINT
8460 IF TEST=1 THEN GOTO 8500
8480 IF (DPAYMENT*SYEARS*DPRINCIPAL*SINTEREST*IPAYMENTNUM)<>0 THEN GOTO 8640 ELSE LET TEST=0
8500 PRINT " Choose from the above menu the item that you would like to change.":GOSUB 1960
8520 MENULIST$="MABCDH"
8540 GOSUB 1540
8560 IF MENUNUM%=6 THEN GOSUB 15000:GOTO 8180
8580 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
8600 ON MENUNUM% GOTO 4380,6600,3240,7440
8620 LET TEST=0:GOTO 8180
8640 REM
8660 PRINT " THE VARIABLES MUST BE PRECISELY CALCULATED FOR THE TABLE TO BE CORRECT."
8680 PRINT : PRINT " Do you want to change any of the above VARIABLES?"
8700 PRINT " ENTER (Y)ES or (N)O or ..."; : PRINT
8720 MENULIST$="MYNH"
8740 GOSUB 1960
8760 GOSUB 1540
8780 IF MENUNUM%=4 THEN GOSUB 15000:GOTO 8180
8800 IF MENUNUM%=1 THEN GOTO 2660 ELSE LET MENUNUM%=MENUNUM%-1
8820 ON MENUNUM% GOTO 8840,8900
8840 LET TEST=1:GOTO 8240
8860 REM
8880 REM
8900 REM ********************BEGINNING OF AMORTIZATION ROUTINE *****
8920 PRINT CLS$
8940 SCOUNTER=0
8960 LET TEST=0
8980 PRINT " Do you want this run to go to the printer?  (Enter Y or N) ";
9000 GOSUB 1740
9020 ON MENUNUM% GOTO 9040,9080
9040 LET PRINTER=1:REM-- SET PRINTER FLAG TO ON
9060 GOTO 9100
9080 LET PRINTER=0:REM-- SET PRINTER FLAG OFF
9100 PRINT:PRINT:PRINT " Do you want to display annual totals only?  (Enter Y or N) ";:GOSUB 1740:ON MENUNUM% GOTO 9120,9160
9120 LET IDISPLAY=1
9140 GOTO 9180
9160 LET IDISPLAY=0
9180 REM - INITIALIZE VARIABLES
9200 GOSUB 13100
9220 SI=(SINTEREST*.01)/IPAYMENTNUM:REM CONVERT INTEREST TO DECIMAL         
9240 IPAGE=0
9260 GOSUB 10020
9280 DBO=DPRINCIPAL
9300 DPAY=(INT(DPAYMENT*100+.5))*.01
9320 SJ2=IPAYMENTNUM*SYEARS
9340 SI2=(SINTEREST/IPAYMENTNUM)
9360 SCURRENTYEAR=1
9380 MENUNUM%=0
9400 REM **************************  HERE'S THE LOOP *********
9420 FOR SJ1=1 TO SJ2
9440 DI3=(INT(DBO*SI2+.5))*.01
9460 IF DBO<DPAYMENT THEN DPAY=DBO+DI3
9480 DBO=DBO-DPAY+DI3
9500 DBI=DPAY-DI3
9520 IF MENUNUM%=3 THEN GOTO 9580
9540 IF SCOUNTER>=21 THEN GOSUB 10740:ON MENUNUM% GOTO 9620,8180,9580
9560 GOTO 9620
9580 IF SCOUNTER>=21 THEN GOSUB 12100
9600 IF MENUNUM%=2 GOTO 8180
9620 DINTYEAR=DINTYEAR+DI3:DPRINYEAR=DPRINYEAR+DBI
9640 GOSUB 10400
9660 IF SJ1=SCURRENTYEAR*IPAYMENTNUM THEN DINTTOTAL=DINTTOTAL+DINTYEAR:DPRINTOTAL=DPRINTOTAL+DPRINYEAR:GOSUB 11780:SCURRENTYEAR=SCURRENTYEAR+1
9680 IF PRINTER=1 AND SLCOUNTER>=60 THEN GOSUB 12940:GOSUB 12460
9700 NEXT SJ1:REM ***************** END OF LOOP  ************************
9720 IF SJ1<>SCURRENTYEAR*IPAYMENTNUM THEN DINTTOTAL=DINTTOTAL+DINTYEAR:DPRINTOTAL=DPRINTOTAL+DPRINYEAR
9740 IF SCOUNTER>=21 THEN GOSUB 10740:ON MENUNUM% GOTO 9760,8180,9760 ESLE GOSUB 12100
9760 PRINT:PRINT "*TOTALS: ";
9780 IF PRINTER=0 THEN GOTO 9840
9800 IF SLCOUNTER>=60 THEN GOSUB 12940:GOSUB 12460
9820 LPRINT "*TOTALS: ";
9840 PRINT USING "$$###########.##";DINTTOTAL;
9860 IF PRINTER=0 THEN GOTO 9900
9880 LPRINT USING "$$###########.##";DINTTOTAL;
9900 SCOUNTER=SCOUNTER+2
9920 PRINT USING "  $$###########.##";DPRINTOTAL
9940 IF PRINTER=0 THEN GOTO 10000
9960 LPRINT USING "  $$###########.##";DPRINTOTAL
9980 SLCOUNTER=SLCOUNTER+2
10000 GOTO 11480
10020 REM - ROUTINE TO SET UP SCREEN DISPLAY
10040 IF PRINTER=1 THEN GOSUB 10960
10060 PRINT CLS$;
10080 PRINT " *********************  LOAN AMORTIZATION TABLE  ***********************"
10100 SCOUNTER=SCOUNTER+4
10120 PRINT " PRINCIPAL AMOUNT: ";
10140 PRINT USING "$$###########.##";DPRINCIPAL;
10160 PRINT "  PAYMENT AMOUNT: ";
10180 PRINT USING "$$#########.##";DPAYMENT
10200 PRINT " TERM IN YEARS: ";
10220 PRINT USING "             ###.# ";SYEARS;
10240 PRINT "  INTEREST RATE: ";
10260 PRINT USING "         ###.##";SINTEREST;:PRINT "%"
10280 PRINT " ***********************************************************************"
10300 REM - HEADER FOR SCREEN DISPLAY PAGE
10320 PRINT " PAYMENT #       INTEREST         PRINCIPAL        BALANCE AFTER PAYMENT"
10340 PRINT " -----------------------------------------------------------------------"
10360 LET SCOUNTER=SCOUNTER+2
10380 RETURN
10400 REM - SCREEN DISPLAY FOR EACH PAYMENT
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  ***********
12120 TEST$=INKEY$
12140 IF TEST$=CHR$(13) THEN GOTO 12300
12160 PRINT CHR$(13);SPC(75);CHR$(13);
12180 SCOUNTER=0
12200 PRINT " ********  SCREEN PAUSE DISABLED.  PRESS RETURN TO ENABLE.  *******";
12220 FOR ILOOP=1 TO 800
12240 NEXT ILOOP
12260 TEST$=INKEY$
12280 IF TEST$<>CHR$(13) THEN GOSUB 10060:RETURN
12300 SCOUNTER=0
12320 PRINT CHR$(13);SPC(75);CHR$(13);
12340 PRINT "                SELECT (C)ONTINUE OR (A)BORT "
12360 MENULIST$="CA"
12380 GOSUB 1540
12400 IF MENUNUM%=1 THEN GOSUB 10060:MENUNUM%=0:RETURN
12420 IF MENUNUM%=2 THEN RETURN
12440 STOP
12460 REM ----------------ROUTINE FOR PRINTER PAGE HEADER-----------------
12480 LPRINT " *********************  LOAN AMORTIZATION TABLE  ***********************"
12500 LPRINT " PRINCIPAL AMOUNT: ";
12520 LPRINT USING "$$###########.##";DPRINCIPAL;
12540 LPRINT "  PAYMENT AMOUNT: ";
12560 LPRINT USING "$$#########.##";DPAYMENT
12580 LPRINT " TERM IN YEARS: ";
12600 LPRINT USING "             ###.# ";SYEARS;
12620 LPRINT "  INTEREST RATE: ";
12640 LPRINT USING "         ###.##";SINTEREST;:LPRINT "%"
12660 LPRINT " ***********************************************************************"
12680 LPRINT " PAYMENT #       INTEREST         PRINCIPAL        BALANCE AFTER PAYMENT"
12700 LPRINT " -----------------------------------------------------------------------"
12720 LET SLCOUNTER=6
12740 RETURN
12760 REM --------------------------- ROUTINE TO LPRINT YEARLY TOTALS -----
12780 IF IDISPLAY=1 THEN LPRINT:SLCOUNTER=SLCOUNTER+1
12800 LPRINT "*YEAR:";
12820 LPRINT USING "###";SCURRENTYEAR;
12840 LPRINT USING "$$###########.##";DINTYEAR;
12860 LPRINT USING "  $$###########.##";DPRINYEAR;
12880 LPRINT USING "     $$#############.##";DBO
12900 LPRINT:SLCOUNTER=SLCOUNTER+2
12920 RETURN
12940 REM ----------  ROUTINE TO PUT PAGE NUMBERS ON PRINTOUT
12960 REM
12980 IPAGE=IPAGE+1
13000 FOR PAGECOUNT=1 TO (62-SLCOUNTER)
13020 LPRINT:NEXT PAGECOUNT
13040 LPRINT "                             ";IPAGE
13060 LPRINT CHR$(12)
13080 RETURN
13100 REM    SUBROUTINE FOR SETTING FLAG FOR FIRST YEAR OF PRINTOUT
13120 PRINT:PRINT:PRINT " Do you want to start with a year other than 1?  (Y or N) "; 
13140 GOSUB 1740
13160 IF MENUNUM%=2 THEN ISTART=0:RETURN
13180 INPUT " Please enter the year you want to start with..... ",ISTART
13200 IF ISTART>SYEARS THEN LET ISTART=SYEARS
13220 RETURN
13240 REM *******************MENU CHOICE H*****************************
13260 PRINT "   From the above menu, please select the item you need help with."
13280 MENULIST$="ABCDEFGX"
13300 GOSUB 1540
13320 ON MENUNUM% GOSUB 13360,13760,13980,14260,14520,14760,15000,15500
13340 GOTO 1320
13360 REM ----  MENU SELECTION A
13380 PRINT CLS$
13400 PRINT
13420 PRINT "       *** LOAN PRINCIPAL AMOUNT ***"
13440 PRINT
13460 PRINT " This module will calculate the amount of money initially borrowed."
13480 PRINT " You must enter the amount of the payments, the interest rate, the"
13500 PRINT " number of payments within a year and the number of years over which"
13520 PRINT " the loan is going to be amortized."
13540 PRINT:GOSUB 13560:RETURN
13560 PRINT " Using the menu, select each item that needs to be entered.  As soon"
13580 PRINT " as you've entered the needed variables, the program will perform the"
13600 PRINT " calculation and display the results.  To try a different variable,"
13620 PRINT " use the menu to select which one you want to change.  Enter the new"
13640 PRINT " value and the calculation will be redone automatically for you."
13660 PRINT
13680 PRINT " You cannot enter a negative number for any variable in this program."
13700 PRINT " Do not use any commas when entering variables.  Press the return"
13720 PRINT " after entering each variable."
13740 GOSUB 15540:RETURN
13760 REM      HELP FOR MENU CHOICE B
13780 PRINT CLS$;
13800 PRINT
13820 PRINT "         ** REGULAR PAYMENT **"
13840 PRINT 
13860 PRINT " This module will calculate the amount of the regular payment needed to"
13880 PRINT " pay off a loan over a given time.  You must enter the amount borrowed,"
13900 PRINT " the interest rate, the number of payments per year and the number of years"
13920 PRINT " or term of the loan."
13940 PRINT
13960 GOSUB 13560:RETURN
13980 REM    HELP FOR ITEM C
14000 PRINT CLS$;
14020 PRINT
14040 PRINT "        **  LAST PAYMENT ON A LOAN  **"
14060 PRINT
14080 PRINT " Because of rounding errors, the last payment on a loan is usually slightly"
14100 PRINT " different than the regular payment.  This module actually does a com-"
14120 PRINT " plete loan amortization table in memory and calculates the exact amount"
14140 PRINT " of the final payment.  You must enter the regular payment, the principal,"
14160 PRINT " the term (in years) the interest rate and the number of payments per"
14180 PRINT " year.  If any of these variables need to be calculated, use the other"
14200 PRINT " modules first and then select this module from the MAIN MENU."
14220 PRINT
14240 GOSUB 13560:RETURN
14260 REM     HELP FOR MENU ITEM D
14280 PRINT CLS$
14300 PRINT
14320 PRINT "      **  REMAINING BALANCE ON A LOAN  **"
14340 PRINT
14360 PRINT " This module will calculate the amount remaining on the principal of a"
14380 PRINT " loan after a specific number of payments have been made.  Typically,"
14400 PRINT " this would be needed in the event that it was desired to pay off a loan"
14420 PRINT " early.  The module actually does a loan amortization table in memory"
14440 PRINT " and stops at the payment you have specified.  The balance of the
14460 PRINT " PRINCIPAL is then displayed.
14480 PRINT
14500 GOSUB 13560:RETURN
14520 REM      HELP FOR MENU ITEM E
14540 PRINT CLS$
14560 PRINT
14580 PRINT "     **  TERM OF A LOAN  **
14600 PRINT
14620 PRINT " This module will determine the time (in years) needed to repay a loan"
14640 PRINT " for a given set of variables.  For example, this could be used to see
14660 PRINT " what effect changing the payment or the interest would have on the
14680 PRINT " period required to repay the loan.  The program will not allow an entry
14700 PRINT " that would result in the loan being under-amortized such as would happen
14720 PRINT " in the event that the payment was too small to ever repay the loan.
14740 PRINT:GOSUB 13560:RETURN
14760 REM       HELP FOR MENU ITEM F
14780 PRINT CLS$
14800 PRINT
14820 PRINT "      **  ANNUAL INTEREST RATE ON A LOAN  **
14840 PRINT 
14860 PRINT " This module will calculate the interest rate on a loan given a specific
14880 PRINT " set of variables.  This is useful if the interest rate is unknown or if
14900 PRINT " it is desired to determine the impact on interest of changes in other
14920 PRINT " variables.  The program cannot calculate interest rates that are greater
14940 PRINT " than 25%.
14960 PRINT
14980 GOSUB 13560:RETURN
15000 REM           HELP FOR ITEM G
15020 PRINT CLS$;
15040 PRINT "       **  LOAN AMORTIZATION TABLE  **
15060 PRINT 
15080 PRINT " This module will show the amount of interest and principal paid for
15100 PRINT " each payment on a loan.  This listing can be displayed on the console
15120 PRINT " screen only or it can be listed to a printer simultaneously.  Since
15140 PRINT " the table can only be accurate if the variables are precisely calculated,
15160 PRINT " you have to use other modules to make changes to the variables before
15180 PRINT " you can run the amortization table module.  Selecting an item from
15200 PRINT " the menu to be changed will automatically chain you into the appropriate
15220 PRINT " module.
15240 PRINT
15260 PRINT " If the printer is selected, you will be asked for information to go
15280 PRINT " on the title block on the printer.  This information will be saved
15300 PRINT " and does not have to be reentered if you go to another module and then
15320 PRINT " return to the amortization module.
15340 PRINT 
15360 PRINT " You should check the printer to be sure it is ready prior to trying 
15380 PRINT " to send a listing to the printer.  If the printer is not ready, the
15400 PRINT " program will display a message and the program will stop.  If the"
15420 PRINT " printer cannot be made ready, you will have to abort the program using"
15440 PRINT " the ^C key."
15460 PRINT
15480 GOSUB 15540:RETURN
15500 REM
15520 REM
15540 PRINT:PRINT " PRESS ANY KEY TO RETURN TO THE MENU. ";:ANS$=INPUT$(1):RETURN
15560 REM
15580 REM *******************MENU CHOICE X*****************************
15600 PRINT CLS$
15620 PRINT
15640 PRINT 
15660 PRINT " RETURN TO OPERATING SYSTEM?  (Y OR N)"
15680 MENULIST$="YN"
15700 GOSUB 1540
15720 ON MENUNUM% GOTO 15760,2660
15740 REM
15760 PRINT
15780 PRINT
15800 PRINT
15820 PRINT " Now returning control to the operating system."
15840 PRINT
15860 SYSTEM
15880 REM   "L" TEST LOAD OPTION
15900 DPRINCIPAL=15000
15920 SINTEREST=8
15940 DPAYMENT=263
15960 SYEARS=6
15980 IPAYMENTNUM=12
16000 PRINT "      ********  NOW LOADING TEST VALUES INTO VARIABLES  *******";
16020 FOR G=1 TO 200
16040 NEXT G
16060 PRINT CHR$(13);SPC(70);CHR$(13);
16080 MENULIST$="ABCDEFGHX"
16100 GOSUB 1580
16120 GOTO 3220
