This program estimates how much life insurance a user needs, based on a formula adapted from a 1983 Parade Magazine article by Andrew Tobias. It collects the user’s take-home pay (at 75%), expected Social Security benefits, a chosen time horizon from a fixed table of multipliers, a lump-sum cushion, and existing assets, then computes the insurance gap. The title screen uses block graphic characters (█) and INVERSE text to render a decorative banner with BORDER, PAPER, and INK commands for a styled presentation. A subroutine at line 2000 handles paged output using FLASH text and PAUSE 0 for keypress-gated screen clearing, and the program supports COPY to print the summary or restart via a C/A prompt.
Program Analysis
Program Structure
The program is divided into clearly separated functional blocks:
- Lines 5–20: REM headers and splash screen subroutine call.
- Lines 100–195: Explain the method and collect 75% take-home pay (
p). - Lines 200–290: Collect Social Security annual benefit (
b). - Lines 300–490: Compute the annual income gap, look up the time-period multiplier (
a), and calculate total money needed. - Lines 500–690: Collect lump-sum expenses (
l) and existing assets (gl). - Lines 700–880: Display a formatted summary and offer COPY or restart.
- Lines 1000–1500: Title screen subroutine using block graphics and INVERSE text.
- Lines 2000–2200: Paged-output “press any key” subroutine.
- Line 9999: SAVE routine with auto-run.
Input Variables
| Variable | Description |
|---|---|
p | 75% of annual take-home pay (income needed) |
b | Annual Social Security benefits |
t | Time period in years (from fixed table) |
a | Multiplier corresponding to t |
l | Lump sum for funeral/debt expenses |
gl | Existing group life insurance and assets |
n$ | User response for COPY or AGAIN prompt |
Time-Period Multiplier Table
Lines 390–450 implement a lookup table via sequential IF statements, mapping the user’s chosen time period to a present-value multiplier. This approach assumes a fixed interest/discount rate baked into each multiplier value:
Years (t) | Multiplier (a) |
|---|---|
| 5 | 4.7 |
| 10 | 8.7 |
| 15 | 12 |
| 20 | 15 |
| 25 | 18 |
| 30 | 20 |
| 50 | 26 |
The validation at line 385 (IF t<5 OR t>50 THEN GO TO 380) re-prompts if the value is out of range, but does not catch invalid values between valid table entries (e.g., entering 7 passes validation but matches no IF, leaving a uninitialized or holding a stale value from a previous run). This is a latent bug.
Paged Output Subroutine
The subroutine at lines 2000–2200 is called repeatedly (lines 195, 290, 490, 560, 690, and 1450) to pause between screens. It uses FLASH 1 to draw attention to the prompt at the bottom of the screen, then PAUSE 0 to wait for any keypress before issuing CLS. This is an efficient and idiomatic screen-paging pattern.
Title Screen and Display Techniques
The splash screen subroutine (lines 1000–1500) sets BORDER 1, PAPER 1, and INK 7 (blue background, white text), then builds a banner using the \:: block graphic (█) printed with TAB positioning to create decorative borders around the words “LIFE”, “INSURANCE”, and “ESTIMATER”. INVERSE 1 is used for the text between the block-graphic borders to create a highlighted effect.
Summary Screen
Lines 710–800 use INVERSE 1 on label strings and TAB positioning for the corresponding numeric values, creating a rudimentary columnar layout. The final insurance need is computed inline as (((a*(p-b))+l)-gl) and displayed with INVERSE 1 at line 800 to highlight the result.
Notable Techniques and Idioms
- The variable name
glsuggests “group life” insurance/assets, a meaningful mnemonic. - The
COPYcommand at line 860 sends the current screen to a ZX Printer, enabling a paper record of the insurance summary. - Line 870 uses
RUN 100rather thanGO TO 100, which clears all variables before restarting — appropriate here since all values should be fresh for a new estimate. - Long explanatory text is crammed into
PRINTstring literals that wrap naturally at the 32-column display width, with deliberate breaks managed by the programmer to avoid mid-word splits. - Line 800 contains a semicolon-separated mix of a literal string,
TAB, and an expression, demonstrating compositePRINTstatement construction for alignment.
Bugs and Anomalies
- Unguarded multiplier assignment: As noted, entering a year value between 5 and 50 that does not exactly match a table entry (e.g., 12) passes the range check at line 385 but leaves
aat whatever its previous value was, silently producing an incorrect result. - Typo in program title: “ESTIMATER” is consistently used throughout (lines 5, 100, 1060) — this appears to be intentional stylization rather than a bug, as it matches the Parade Magazine source.
- PAUSE 0 / CLS pattern: The
PAUSE 0at line 2100 consumes a keypress butCLSimmediately follows without re-displaying any screen content, so the user sees a blank screen momentarily before the calling code continues — a minor cosmetic issue. - Line 800 apostrophe: The
'mid-PRINTstatement acts as a newline within the print list, moving to the next line before theTAB 13and final value — this is intentional formatting to split the label text from the dollar amount.
Content
Source Code
5 REM Life Insurance Estimat-er from PARADE MAGAZINE, April 24, 1983, by Andrew Tobias
10 REM Adapted for computer use by John Colonna, SINCUS
20 GO SUB 1000
100 PRINT : PRINT : PRINT : PRINT " LIFE INSURANCE ESTIMATER"
110 PRINT : PRINT : PRINT
120 PRINT " Simply stated the amount oflife insurance you need is equalto the amount needed to replace you financially. By using this program you can estimate what your family would need. The first step is to determine 75% of your take-home pay."
150 INPUT "Enter 75% of your annual take- home pay. ";p
170 PRINT : PRINT
180 PRINT " 75% of annual"
190 PRINT " take-home pay = $";p
195 GO SUB 2000
200 PRINT : PRINT : PRINT : PRINT : PRINT
220 PRINT " The next important questionis to find out the Social Secur-ity benefits your family could expect to receive. The current range is between $5000 to $16000(tax-free) a year. Contact your local Security Security office."
230 INPUT "Enter Social Security yearly benefits. ";b
250 PRINT : PRINT : PRINT : PRINT : PRINT " S. S. benefits = $";b
290 GO SUB 2000
300 PRINT : PRINT
320 PRINT " The difference between yourannual income needed (";p;") andyour Social Security benefits (";b;") is $";p-b;"."
330 PRINT " This annual insurance gap you'll want life insurance to make up, but you must decide forhow many years. This depends on the ages of your spouse and children. Choose a time period from the table."
350 PRINT : PRINT " NUMBER OF YEARS"
360 PRINT
370 PRINT "5 10 15 20 25 30 50"
380 INPUT "Enter time period from above. ";t
385 IF t<5 OR t>50 THEN GO TO 380
390 IF t=5 THEN LET a=4.7
400 IF t=10 THEN LET a=8.7
410 IF t=15 THEN LET a=12
420 IF t=20 THEN LET a=15
430 IF t=25 THEN LET a=18
440 IF t=30 THEN LET a=20
450 IF t=50 THEN LET a=26
470 PRINT : PRINT " The amount of money needed for the next ";t;" years is $";a*(p-b);"."
490 GO SUB 2000
500 PRINT : PRINT : PRINT : PRINT : PRINT
520 PRINT " Now you must add a lump sumas a cushion for funeral ex-penses, debts, etc., at least half a year's salary."
550 INPUT "Enter lump sum. ";l
551 PRINT : PRINT : PRINT : PRINT : PRINT : PRINT " Lump sum = $";l
560 GO SUB 2000
600 PRINT : PRINT : PRINT : PRINT
620 PRINT " Now you must subtract what-ever group life insurance you may have at work and also your assets such as savings accounts,stocks, retirement accounts, etc."
630 INPUT "Enter your assets. ";gl
640 PRINT : PRINT : PRINT : PRINT : PRINT " Total assets = $";gl
690 GO SUB 2000
700 PRINT : PRINT : PRINT "SUMMARY OF LIFE INSURANCE NEEDS"
710 PRINT : PRINT : PRINT INVERSE 1;"Annual Income Needed"; INVERSE 0;TAB 23;p
720 PRINT : PRINT INVERSE 1;"Annual S. S. Benefits"; INVERSE 0;TAB 23;b
730 PRINT : PRINT INVERSE 1;"No. of Years Needed"; INVERSE 0;TAB 26;t
740 PRINT : PRINT INVERSE 1;"Amt. of Money Needed"; INVERSE 0;TAB 22;a*(p-b)
750 PRINT : PRINT INVERSE 1;"Lump Sum Expenses"; INVERSE 0;TAB 23;l
760 PRINT : PRINT INVERSE 1;"Assets"; INVERSE 0;TAB 23;gl
800 PRINT : PRINT : PRINT " Your life insurance needs are- "'TAB 13;"$"; INVERSE 1;(((a*(p-b))+l)-gl)
850 INPUT "COPY or AGAIN (C/A)? ";n$
860 IF n$="C" OR n$="c" THEN COPY
870 IF n$="A" OR n$="a" THEN RUN 100
880 GO TO 850
999 STOP
1000 BORDER 1: PAPER 1: INK 7: CLS
1010 PRINT : PRINT : PRINT : PRINT
1015 PRINT TAB 12;"\::\::\::\::\::\::\::\::\::"
1020 PRINT TAB 12; INVERSE 1;" L I F E "
1025 PRINT TAB 12;"\::\::\::\::\::\::\::\::\::"
1030 PRINT : PRINT
1035 PRINT TAB 7;"\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::"
1040 PRINT TAB 7; INVERSE 1;" I N S U R A N C E "
1045 PRINT TAB 7;"\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::"
1050 PRINT : PRINT
1055 PRINT TAB 7;"\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::"
1060 PRINT TAB 7; INVERSE 1;" E S T I M A T E R "
1065 PRINT TAB 7;"\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::"
1450 GO SUB 2000
1500 RETURN
2000 PRINT AT 21,3; FLASH 1;"Press any key to continue."
2100 PAUSE 0: CLS
2200 RETURN
9999 CLEAR : CLS : SAVE "lifeinsest" LINE 1: BEEP 1,32: PRINT "Rewind to VERIFY.": VERIFY "": BEEP .2,30: PRINT FLASH 1;" V E R I F I E D
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.


