Personal Finance Planner is a menu-driven financial calculator that handles house financing, car financing, savings accounts, loans, and amortization schedules. The program solves for any one of five time-value-of-money variables (N, I, PMT, PV, FV) given the other known values, supporting both ordinary annuity (END) and annuity-due (BEG) payment modes. Interest rate solving uses a bisection algorithm (binary search between bounds 0.002 and 85) to iteratively converge on the unknown rate when payments are non-zero, falling back to a direct logarithmic formula when PMT is zero. The animated title sequence draws a bar-chart graphic using a parameterized GOSUB routine that plots columns and rows of dollar signs, then wipes the screen with a scrolling row of dollar signs before entering the main program.
Program Analysis
Program Structure
The program is organized into several distinct functional blocks, navigated via GOTO and GOSUB:
- Lines 5–195: Animated splash screen — fills display with dollar signs in FAST mode, then draws a text-art “MONEY” logo in SLOW mode, pauses, and jumps to the main program.
- Lines 270–1570: Animated bar-chart graphic drawn with parameterized column/row subroutines, ending with a wipe effect before looping back to line 40 (re-entering SLOW mode).
- Lines 2000–2170: Variable initialization and first-run help gate.
- Lines 3000–3095: Main menu — selects program type (House, Car, Savings, Loans, Amortization, End).
- Lines 3100–3650: Context-sensitive help screens for each program type.
- Lines 4000–4140: Calculation mode menu (solve for N, I, PMT, PV, or FV).
- Lines 5000–6360: Data entry and calculation dispatch for all five TVM variables plus BEG/END toggle.
- Lines 7000–7860: Results display, continuation menu, and full amortization schedule generator.
- Lines 8000–8550: Error message, amortization entry guard, and help screen return.
- Lines 9000–9960: Clean exit (STOP) and SAVE line.
Time-Value-of-Money Formulas
The core financial engine implements standard TVM equations. The variable S is the annuity-due flag (1 for BEG, 0 for END), which modifies the payment factor via (1+I*S). The implemented formulas are:
| Variable | Line | Formula |
|---|---|---|
| N | 5320 | -(LN((-P-(1+I*S)*M/I)/(F-(1+I*S)/I*M))/LN(1+I)) |
| PMT | 5720 | (-P-F*(1+I)^(-N))/((1+I*S)*(1-(1+I)^(-N)))*I |
| PV | 5920 | -(M*(1+I*S)/I*(1-(1+I)^(-N))+F*(1+I)^(-N)) |
| FV | 6120 | (-M*(1+I*S)*(1-(1+I)^(-N))/I-P)/((1+I)^(-N)) |
Interest Rate Bisection Solver
Solving for interest rate I (lines 5520–5579) uses a bisection search. Bounds W (low) and C (high, initialized to 85) bracket the solution, and the midpoint U is tested each iteration. The loop continues until the computed payment Q matches M to three decimal places, or until the bounds collapse below 1E-8 or exceed 85-1E-8, at which point an “INTEREST OFF SCALE” error is reported at line 8000. When M=0, a direct formula ((F/-P)^(1/N)-1)*100 is used instead.
Note that the variable W is reused here as the bisection lower bound, which conflicts with its use as a step direction in the animation subroutines. This is safe only because the animation and solver are never active simultaneously.
Animated Title Sequence
The splash screen at lines 270–1570 draws a bar chart of dollar signs using two parameterized subroutines. Subroutine at line 500 draws a vertical column: it takes row start U, row end V, step direction W, and column Y, animating by printing a moving block graphic character ahead of each dollar sign. Subroutine at line 900 is the horizontal equivalent, animating along columns at a fixed row. The wipe at lines 1520–1570 sweeps a block graphic down from row 20, overwriting each row with a line of dollar signs, then jumps to line 40 to re-enter SLOW mode.
Amortization Schedule (Lines 7100–7860)
The amortization module accepts a start and end period and computes principal, interest, and remaining balance for each period. The balance at period J is calculated directly using the closed-form formula at line 7440 rather than iterating from period 1, which avoids accumulated rounding error. A special case at lines 7350–7380 handles the first period of an annuity-due (S=1, J=1) where no interest accrues. The display paginates every 17 rows, pausing with a “PRESS ANY KEY” prompt and clearing the screen to continue.
Key BASIC Idioms and Techniques
- String-encoded state:
A$,X$,Y$are used as mode flags throughout —X$="0"for data entry mode vs.X$="1"for calculation mode;Y$holds the selected program type (“1″–”5”). - Numeric display rounding: All displayed values use the idiom
INT(value*100+0.5)/100to round to two decimal places before converting withSTR$. - INKEY$ polling loops: All key input uses
INKEY$in tight loops (e.g., lines 5080–5082) with CHR$ boundary checks to filter valid keypresses. - Status bar via GOSUB 5072: Lines 5072–5077 form a reusable status display subroutine called from both data entry and calculation menus, showing current values of all TVM variables.
- VAL B$ for balance carry-forward: At line 7430,
LET R=VAL B$recovers the previously stored balance string as a number to compute principal paid — a deliberate use of string storage to preserve the prior period’s rounded balance.
Bugs and Anomalies
- Dead loop at line 4000: Lines 4000–4010 contain two nested
FOR Jloops, the first (FOR J=1 TO 17 STEP 2) immediately superseded by the second (FOR J=1 TO 17). TheRETURNat line 4020 is never reached from the main flow since noGOSUB 4000appears in the program; this subroutine is unused dead code. - Line 880 missing W assignment: The GOSUB 500 call at line 890 uses
U,V, andYset at lines 860–880, butWis not set before this call. It retains whatever value it held from the previous block (line 790,W=-1), which may or may not be the intended step direction. - Amortization guard at line 8200: If program type is Savings (
Y$="3"), the amortization route redirects to the main menu at line 3000. This is intentional but silently discards the user’s request without explanation. - Line 5087 amortization route sets Y$=”5″ at line 8203 only after checking
Y$="3"at 8200, meaning entering amortization from the main menu correctly sets the type, but re-entering via key “5” from the data entry menu (line 5087) bypasses the type assignment entirely and uses the priorY$value.
Content
Image Gallery
Source Code
5 SLOW
10 GOTO 200
20 FOR I=0 TO 21
25 PRINT "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
30 NEXT I
40 SLOW
50 FOR I=0 TO 7
60 PRINT AT I,0;" "
70 NEXT I
80 PRINT AT 8,0;" $ $ $$$ $ $ $$$$$ $ $ "
90 PRINT AT 9,0;" $$ $$ $ $ $$ $ $ $$ $$ "
100 PRINT AT 10,0;" $$$$$ $ $ $$$ $ $ $$$ "
110 PRINT AT 11,0;" $$$$$ $ $ $$$$$ $$$$$ $ "
120 PRINT AT 12,0;" $ $ $ $ $ $ $$$ $ $ "
130 PRINT AT 13,0;" $ $ $ $ $ $$ $ $ "
140 PRINT AT 14,0;" $ $ $$$ $ $ $$$$$ $ "
150 FOR I=15 TO 20
160 PRINT AT I,0;" "
170 NEXT I
173 PRINT AT 21,0;" AMERICAN MICRO PRODUCTS, INC. "
175 FOR I=1 TO 100
180 NEXT I
195 GOTO 2000
270 LET U=8
280 LET V=14
290 LET W=1
295 LET Y=2
300 GOSUB 500
310 PRINT AT 9,3;"[▒]"
320 LET U=9
330 LET V=11
340 LET W=1
350 LET Y=3
360 GOSUB 500
380 LET U=10
390 LET V=12
400 LET W=1
410 LET Y=4
420 GOSUB 500
440 LET U=11
450 LET V=9
460 LET W=-1
470 LET Y=5
475 GOSUB 500
480 GOTO 560
500 PRINT AT U,Y;"[▒]"
505 FOR I=U TO V STEP W
510 PRINT AT I,Y;"$"
520 PRINT AT I+W,Y;"[▒]"
530 NEXT I
540 PRINT AT V+W,Y;" "
550 RETURN
560 LET U=8
570 LET V=14
580 LET W=1
590 LET Y=6
600 GOSUB 500
610 LET U=9
620 LET V=13
630 LET W=1
640 LET Y=8
650 GOSUB 500
660 LET U=9
670 LET V=11
680 LET W=1
690 LET Y=14
700 GOSUB 900
710 LET U=13
720 LET V=9
730 LET W=-1
740 LET Y=12
750 GOSUB 500
760 LET U=11
770 LET V=9
780 LET W=-1
790 LET Y=8
800 GOSUB 900
810 LET U=8
820 LET V=14
830 LET W=1
840 LET Y=14
850 GOSUB 500
860 LET U=9
870 LET V=11
880 LET Y=15
890 GOSUB 500
895 GOTO 960
900 PRINT AT Y,U;"[▒]"
910 FOR I=U TO V STEP W
920 PRINT AT Y,I;"$"
930 PRINT AT Y,I+W;"[▒]"
940 NEXT I
945 PRINT AT Y,V+W;" "
950 RETURN
960 LET U=10
970 LET V=12
980 LET Y=16
990 GOSUB 500
1000 LET U=11
1010 LET V=13
1020 LET Y=17
1030 GOSUB 500
1040 LET U=14
1050 LET V=8
1060 LET W=-1
1070 LET Y=18
1080 GOSUB 500
1090 LET U=20
1100 LET V=24
1110 LET W=1
1120 LET Y=8
1130 GOSUB 900
1140 LET U=9
1150 LET V=14
1160 LET Y=20
1170 GOSUB 500
1180 LET U=21
1190 LET V=24
1200 LET Y=14
1210 GOSUB 900
1220 LET Y=11
1230 GOSUB 900
1240 LET U=8
1250 LET V=9
1260 LET Y=26
1270 GOSUB 500
1280 LET U=9
1290 LET V=10
1300 LET Y=27
1310 GOSUB 500
1320 LET U=8
1330 LET V=9
1340 LET Y=30
1350 GOSUB 500
1360 LET U=9
1370 LET V=10
1380 LET Y=29
1390 GOSUB 500
1400 LET U=10
1410 LET V=14
1420 LET Y=28
1430 GOSUB 500
1520 FOR I=20 TO 0 STEP -1
1530 PRINT AT I,16;"[▒]"
1540 PRINT AT I+1,0;"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
1550 NEXT I
1560 PRINT AT 0,0;"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
1570 GOTO 40
2000 CLS
2001 LET Y$="0"
2002 LET A$="0"
2005 CLS
2020 LET M=0
2030 LET I=0
2040 LET P=0
2050 LET F=0
2060 LET S=0
2070 LET X$="0"
2080 LET T=0
2090 LET E=0
2100 LET G=0
2110 LET M$="0"
2120 LET N$="0"
2130 LET P$="0"
2140 LET F$="0"
2150 LET I$="0"
2160 LET S$="END"
2170 IF A$<>"0" THEN GOTO 3085
2200 PRINT AT 3,1;"FIRST, SELECT THE TYPE OF "
2210 PRINT AT 4,1;"PROGRAM OF INTEREST."
2220 PRINT AT 6,1;"N,I,PMT,PV,FV ARE DIFFERENT"
2230 PRINT AT 7,1;"FOR EACH TYPE OF PROGRAM"
2240 PRINT AT 8,1;"CHOSEN. CHECK HELP"
2250 PRINT AT 10,1;"YOU MAY SOLVE ANY ONE VALUE"
2260 PRINT AT 11,1;"GIVEN THE OTHER THREE OR"
2270 PRINT AT 12,1;"FOUR VALUES"
2280 PRINT AT 14,1;"BEGIN/END SPECIFIES WHETHER"
2290 PRINT AT 15,1;"PAYMENTS ARE ANNUITY OR"
2300 PRINT AT 16,1;"ANNUITY DUE"
2310 PRINT AT 20,0;"** PRESS ANY KEY TO CONTINUE **"
2320 LET A$=INKEY$
2330 IF A$="" THEN GOTO 2320
2340 CLS
3000 CLS
3005 PRINT AT 5,1;"PLEASE PRESS:"
3010 PRINT AT 8,5;"1 HOUSE FINANCING"
3020 PRINT AT 10,5;"2 CAR FINANCING"
3030 PRINT AT 12,5;"3 SAVINGS ACCOUNT"
3035 PRINT AT 14,5;"4 LOANS"
3040 PRINT AT 16,5;"5 AMORTIZATION SCHEDULE"
3050 PRINT AT 18,5;"6 END"
3060 LET A$=INKEY$
3070 IF A$<CHR$ 29 OR A$>CHR$ 34 THEN GOTO 3060
3080 IF A$="6" THEN GOTO 9000
3084 IF Y$<>A$ AND A$<>"5" THEN GOTO 2005
3085 CLS
3086 IF A$="5" THEN LET U$=" AMORTIZATION"
3087 IF A$="5" THEN GOTO 8200
3088 LET Y$=A$
3090 IF Y$="1" THEN LET U$=" HOUSE "
3091 IF Y$="2" THEN LET U$=" CAR "
3092 IF Y$="4" THEN LET U$=" LOAN "
3093 IF Y$="3" THEN LET U$=" SAVING"
3095 GOTO 5000
3100 CLS
3103 PRINT AT 1,8;U$
3105 PRINT AT 3,12;"HELP"
3106 PRINT AT 4,12;"▀▀▀▀"
3110 IF Y$="1" OR Y$="2" THEN GOTO 3200
3120 IF Y$="3" THEN GOTO 3400
3130 IF Y$="4" OR Y$="5" THEN GOTO 3600
3200 PRINT AT 6,3;"N = NUMBER OF MONTHS"
3210 PRINT AT 8,3;"I = MONTH INTEREST RATE"
3220 PRINT AT 10,3;"PMT= MONTH PAYMENT"
3230 LET Z$=" "
3240 IF Y$="2" THEN LET Z$="( TRADE IN)"
3250 PRINT AT 12,3;"PV = PRICE-DOWN PMT";Z$
3360 PRINT AT 14,3;"FV = FUTURE BALANCE"
3370 GOTO 8500
3400 PRINT AT 5,5;"N= COMPOUNDING PERIODS"
3410 PRINT AT 7,5;"I= PERIODIC INTEREST RATE"
3420 PRINT AT 9,3;"PMT= PERIODIC DEPOSIT"
3430 PRINT AT 11,4;"PV= PRESENT BALANCE"
3440 PRINT AT 13,4;"FV= FUTURE BALANCE"
3450 GOTO 8500
3600 PRINT AT 5,5;"N= COMPOUNDING PERIODS"
3610 PRINT AT 7,5;"I= PERIODIC INTEREST RATE"
3620 PRINT AT 9,3;"PMT= PERIODIC PAYMENT"
3630 PRINT AT 11,4;"PV= TOTAL LOAN AMOUNT"
3640 PRINT AT 13,4;"FV= FUTURE BALANCE"
3650 GOTO 8500
4000 FOR J=1 TO 17 STEP 2
4003 FOR J=1 TO 17
4005 PRINT AT J,0;" "
4010 NEXT J
4020 RETURN
4100 LET X$="1"
4105 CLS
4107 PRINT AT 1,8;U$
4108 PRINT AT 3,9;"CALCULATION"
4109 PRINT AT 4,9;"▀▀▀▀▀▀▀▀▀▀▀"
4110 PRINT AT 6,1;"PLEASE PRESS: "
4112 PRINT AT 8,5;"1 FOR N"
4114 PRINT AT 9,5;"2 FOR I"
4116 PRINT AT 10,5;"3 FOR PMT"
4118 PRINT AT 11,5;"4 FOR PV"
4120 PRINT AT 12,5;"5 FOR FV"
4130 PRINT AT 13,5;"6 FOR CHANGE DATA"
4135 PRINT AT 14,5;"7 FOR OTHERS"
4140 GOSUB 5072
4150 GOTO 5080
5000 LET X$="0"
5001 CLS
5002 PRINT AT 1,8;U$
5003 PRINT AT 3,10;"DATA ENTRY"
5004 PRINT AT 4,10;"▀▀▀▀▀▀▀▀▀▀"
5005 PRINT AT 6,1;"PLEASE PRESS: "
5008 PRINT AT 8,5;"0 FOR BEG/END "
5010 PRINT AT 9,5;"1 FOR N (PERIODS)"
5020 PRINT AT 10,5;"2 FOR I (INTEREST)"
5030 PRINT AT 11,5;"3 FOR PMT(PAYMENT)"
5040 PRINT AT 12,5;"4 FOR PV (PRESENT VALUE)"
5050 PRINT AT 13,5;"5 FOR FV (FUTURE VALUE)"
5060 IF Y$<>"5" THEN PRINT AT 14,5;"6 FOR CALCULATION"
5063 IF Y$="5" THEN PRINT AT 14,5;"6 FOR SCHEDULE"
5065 PRINT AT 15,5;"7 FOR HELP"
5066 PRINT AT 16,5;"8 FOR OTHERS"
5068 GOSUB 5072
5070 GOTO 5080
5072 PRINT AT 18,0;"--------------------------------"
5073 PRINT AT 19,1;"BEG/END= ";S$;TAB 16;" N= ";N$
5074 PRINT AT 20,1;" I= ";I$;TAB 16;"PMT= ";M$
5075 PRINT AT 21,1;"PV= ";P$;TAB 16;" FV= ";F$
5077 RETURN
5080 LET A$=INKEY$
5082 IF A$<CHR$ 28 OR A$>CHR$ 36 THEN GOTO 5080
5084 IF A$="8" AND X$="0" THEN GOTO 3000
5085 IF A$="7" AND X$="0" THEN GOTO 3100
5086 IF A$="7" AND X$="1" THEN GOTO 3000
5087 IF A$="6" AND Y$="5" AND X$="0" THEN GOTO 8200
5088 IF A$="6" AND Y$<>"5" AND X$="0" THEN GOTO 4100
5089 CLS
5090 IF A$="1" THEN GOTO 5300
5100 IF A$="2" THEN GOTO 5500
5110 IF A$="3" THEN GOTO 5700
5120 IF A$="4" THEN GOTO 5900
5130 IF A$="5" THEN GOTO 6100
5140 IF A$="0" AND X$="0" THEN GOTO 6300
5150 IF A$="6" AND X$="1" THEN GOTO 5000
5160 GOTO 5080
5300 REM "NUM"
5310 IF X$="0" THEN GOTO 5400
5320 LET N=-(LN ((-P-(1+I*S)*M/I)/(F-(1+I*S)/I*M))/LN (1+I))
5330 CLS
5340 LET N$=STR$ (INT (N*100+0.5)/100)
5350 PRINT AT 5,3;"NUMBER OF PERIODS= ";N$
5360 GOTO 7000
5400 PRINT AT 2,1;"NUMBER OF PERIODS=?"
5410 GOSUB 5072
5420 INPUT N
5425 LET N$=STR$ (INT (N*100+0.5)/100)
5430 CLS
5440 GOTO 5000
5500 REM INT
5510 IF X$="0" THEN GOTO 5600
5520 LET U=0.002
5522 LET C=85
5524 LET W=0
5525 IF M<>0 THEN GOTO 5540
5526 LET T=((F/-P)**(1/N)-1)*100
5530 LET I=T/100
5535 GOTO 5580
5540 IF U<1E-8 OR U>85-1E-8 THEN GOTO 8000
5545 LET Q=(-P-F*(1+U)**(-N))/((1+U*S)*(1-(1+U)**(-N)))*U
5560 IF INT (Q*1000)<>INT (M*1000) THEN GOTO 5570
5562 LET I=U
5564 LET T=I*100
5566 GOTO 5580
5570 IF Q<M AND P<=0 THEN LET W=U
5572 IF Q>M AND P<=0 THEN LET C=U
5574 IF Q<M AND P>0 THEN LET C=U
5576 IF Q>M AND P>0 THEN LET W=U
5578 LET U=W+(C-W)/2
5579 GOTO 5540
5580 LET I$=STR$ (INT (T*100+0.5)/100)
5590 PRINT AT 5,3;"INTEREST RATE= ";I$
5595 GOTO 7000
5600 PRINT AT 2,1;"INTEREST RATE=?"
5605 PRINT AT 3,1;"(ANNUAL INTEREST / 12)"
5610 GOSUB 5072
5620 INPUT T
5630 LET I=T/100
5640 LET I$=STR$ (INT (T*100+0.5)/100)
5645 CLS
5650 GOTO 5000
5700 REM PMT
5710 IF X$="0" THEN GOTO 5800
5720 LET M=(-P-F*(1+I)**(-N))/((1+I*S)*(1-(1+I)**(-N)))*I
5730 LET M$=STR$ (INT (M*100+0.5)/100)
5740 IF Y$<>"3" THEN PRINT AT 5,3;"PAYMENT= ";M$
5745 IF Y$="3" THEN PRINT AT 5,3;"DEPOSIT= ";M$
5750 GOTO 7000
5800 IF Y$<>"3" THEN PRINT AT 2,1;"PAYMENT= ?"
5805 IF Y$="3" THEN PRINT AT 2,1;"DEPOSIT= ?"
5810 GOSUB 5072
5820 INPUT M
5830 LET M$=STR$ (INT (M*100+0.5)/100)
5840 CLS
5850 GOTO 5000
5900 REM PV
5910 IF X$="0" THEN GOTO 6000
5920 LET P=-(M*(1+I*S)/I*(1-(1+I)**(-N))+F*(1+I)**(-N))
5930 LET P$=STR$ (INT (P*100+0.5)/100)
5940 PRINT AT 5,3;"PRESENT VALUE= ";P$
5950 GOTO 7000
6000 PRINT AT 2,1;"PRESENT VALUE=?"
6010 GOSUB 5072
6020 INPUT P
6030 LET P$=STR$ (INT (P*100+0.5)/100)
6040 CLS
6050 GOTO 5000
6100 REM FV
6110 IF X$="0" THEN GOTO 6200
6120 LET F=(-M*(1+I*S)*(1-(1+I)**(-N))/I-P)/((1+I)**(-N))
6130 LET F$=STR$ (INT (F*100+0.5)/100)
6140 PRINT AT 5,3;"FUTURE VALUE= ";F$
6150 GOTO 7000
6200 PRINT AT 2,1;"FUTURE VALUE=?"
6210 GOSUB 5072
6220 INPUT F
6230 LET F$=STR$ (INT (F*100+0.5)/100)
6240 CLS
6250 GOTO 5000
6300 PRINT AT 2,1;"BEGIN/END(1/0)=?"
6310 GOSUB 5072
6320 INPUT S
6325 IF S<>1 AND S<>0 THEN GOTO 6320
6330 IF S=0 THEN LET S$="END"
6340 IF S=1 THEN LET S$="BEG"
6350 CLS
6360 GOTO 5000
7000 PRINT AT 15,3;"PLEASE PRESS:"
7010 PRINT AT 17,5;"1 FOR CONTINUE"
7020 PRINT AT 19,5;"2 FOR OTHERS"
7025 PRINT AT 21,5;"3 FOR END PROGRAM"
7030 LET A$=INKEY$
7040 IF A$="1" THEN GOTO 5000
7050 IF A$="3" THEN GOTO 9000
7055 IF A$="2" THEN GOTO 3000
7060 GOTO 7030
7100 REM AMORTIZE
7110 CLS
7120 LET K=1
7130 LET D$="0"
7140 LET E=0
7150 LET G=0
7160 PRINT AT 2,1;"START PERIOD(1--";N;")=?"
7170 PRINT AT 4,1;E
7180 INPUT E
7190 IF E<1 OR E>N OR INT E<E THEN GOTO 7180
7200 PRINT AT 4,1;E
7210 PRINT AT 7,1;"END PERIOD(";E;"--";N;")=?"
7220 PRINT AT 9,1;G
7230 INPUT G
7240 IF G<E OR G>N OR INT G<G THEN GOTO 7230
7250 PRINT AT 9,1;G
7260 PRINT AT 11,1;"EDIT DATA(Y/N)?"
7270 INPUT A$
7280 CLS
7290 IF A$="Y" THEN GOTO 7160
7300 LET B=(ABS M*((1+I)**(-E+1)-1)/I+ABS P)/(1+I)**(-E+1)
7310 LET H=0
7320 LET W=0
7330 LET B$=STR$ (INT (B*100+0.5)/100)
7340 FOR J=E TO G
7350 IF S<>1 OR J<>1 THEN GOTO 7400
7360 LET L=0
7365 LET R=ABS M
7370 LET B=ABS P-ABS M
7380 GOTO 7500
7400 LET L=ABS (B*I)
7420 LET L=INT (L*100+0.5)/100
7430 LET R=VAL B$
7440 LET B=(ABS M*((1+I)**(-J)-1)/I+ABS P)/(1+I)**(-J)
7450 LET B$=STR$ (INT (B*100+0.5)/100)
7460 LET R=R-VAL B$
7500 LET R=INT (R*100+0.5)/100
7505 IF D$="1" THEN GOTO 7600
7510 PRINT AT 5,5;"AMORTIZATION SCHEDULE"
7520 PRINT AT 6,5;"▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
7530 PRINT AT 8,6;" PRINCIPAL: ";P$
7540 PRINT AT 10,6;" INTEREST: ";I$
7550 PRINT AT 12,6;" PERIODS: ";N$
7560 PRINT AT 14,6;" PAYMENT: ";VAL M$
7570 PRINT AT 21,0;"** PRESS ANY KEY TO CONTINUE **"
7572 LET A$=INKEY$
7575 IF A$="" THEN GOTO 7572
7580 LET D$="1"
7590 CLS
7600 IF K<>1 THEN GOTO 7700
7610 PRINT AT 1,0;"N PRINCIPAL INTEREST BALANCE"
7620 PRINT AT 2,0;"--------------------------------"
7630 LET X=3
7640 LET K=K+2
7700 PRINT AT K,0;STR$ J;TAB 4;R;TAB 13;L;TAB 22;VAL B$
7710 LET K=K+1
7720 IF K=20 THEN LET K=1
7721 IF K=1 THEN PRINT AT 21,0;"** PRESS ANY KEY TO CONTINUE **"
7723 IF K=1 THEN LET A$=INKEY$
7724 IF K=1 AND A$="" THEN GOTO 7723
7725 IF K=1 THEN CLS
7730 LET H=H+L
7740 LET W=W+R
7750 NEXT J
7752 IF K+4>19 THEN PRINT AT 21,0;"** PRESS ANY KEY TO CONTINUE **"
7753 IF K+4<20 THEN GOTO 7760
7755 LET A$=INKEY$
7756 IF A$="" THEN GOTO 7755
7760 LET K=K+1
7780 IF K+4<20 THEN GOTO 7800
7790 CLS
7795 LET K=2
7800 PRINT AT K,1;"TOTALS FOR PERIODS ";E;" TO ";G
7810 PRINT AT K+2,5;"PRINCIPAL: ";W
7820 PRINT AT K+4,5;"INTEREST : ";H
7830 PRINT AT 21,0;"** PRESS ANY KEY TO CONTINUE **"
7840 LET A$=INKEY$
7850 IF A$="" THEN GOTO 7840
7855 CLS
7860 GOTO 7000
8000 PRINT AT 5,3;"INTEREST OFF SCALE"
8010 GOTO 7000
8200 IF Y$="3" THEN GOTO 3000
8203 LET Y$="5"
8210 IF M=0 AND P=0 THEN GOTO 5000
8230 IF N=0 AND T=0 THEN GOTO 5000
8240 IF P<0 THEN LET M=ABS M
8250 IF P>0 THEN LET M=-1*ABS M
8260 GOTO 7100
8500 PRINT AT 16,1;"POSITIVE(+)VALUES FOR CASH IN"
8510 PRINT AT 17,1;"NEGATIVE(-)VALUES FOR CASH OUT"
8520 PRINT AT 20,0;" ** PRESS ANY KEY FOR RETURN **"
8530 LET A$=INKEY$
8540 IF A$="" THEN GOTO 8530
8545 CLS
8550 GOTO 5000
9000 CLS
9010 STOP
9950 SAVE "MONE[Y]"
9960 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.