This program is a comprehensive personal finance manager that tracks income and payments across up to 20 user-defined categories and 12 months, storing data in parallel arrays. It offers a menu-driven interface with ten distinct functions: file updating, review, category totals by month, year-to-date summaries, tax deduction tracking, file renaming, file maintenance, check/deposit entry, check register review, and endorsee-based totals. A separate checkbook reconciliation module (option A) walks through each transaction and compares the running balance against a bank statement total. The program uses a custom UDG character defined via binary DATA at line 9989, a currency formatting subroutine at lines 9990–9993 that handles zero, whole-number, and single-decimal cases, and saves its data state to tape using SAVE with a LINE auto-run parameter.
Program Analysis
Program Structure
The program is organized around a central menu loop at lines 100–700, with ten major subsystems branched to by single-keypress selection. Initialization occupies lines 10–27, setting up all arrays and reading month-name DATA. Lines 77–79 handle year entry and UDG setup. The menu dispatch at lines 490–640 uses a chain of IF q$= comparisons rather than a computed GO TO.
| Line Range | Function |
|---|---|
| 1–3 | Title screen and instructions |
| 10–27 | Array initialization and month DATA |
| 77–79 | Year input and UDG definition |
| 80–700 | Main menu and dispatch |
| 1000–1370 | Update / review monthly file entries |
| 2000–2190 | Category totals by month (graphical grid) |
| 2300–2490 | Year-to-date income/payments summary |
| 2600–2970 | File maintenance (rename, adjust amounts, tax) |
| 3000–3260 | Check and deposit entry |
| 3510–3670 | Review check listing by check number |
| 4000–4140 | Year-to-date totals by endorsee |
| 5000–5300 | Review check listing by date / reconciliation |
| 5100–5300 | Reconcile checking account |
| 6000–6070 | Tax deduction review |
| 8000–8190 | Entry subroutine for updating amounts |
| 8500–8720 | Define file names |
| 9000–9090 | Save to tape |
| 9150–9330 | Utility subroutines (copy prompt, repeat/menu prompt) |
| 9989–9999 | DATA, formatting, beep, and save/run lines |
Data Storage
Financial data lives in a two-dimensional numeric array m(12,20) where the first index is month (1–12) and the second is category/file (1–20). Negative values represent payments; positive values represent income. The 20 category names are stored in b$(20,15), initialized to "File # n" but user-renameable. Tax deduction totals per category are kept in t(20).
The check register uses five parallel string arrays, each dimensioned to 350 entries: c$(350,8) for dates, d$(350,4) for check numbers, e$(350,20) for payees, f$(350,7) for amounts (with a leading sign character), and g$(350,20) for running balance expressions. A sixth array r$(350,1) stores reconciliation status per transaction.
Currency Formatting Subroutine
Lines 9990–9993 implement a small formatting routine that takes a value in temp and returns a string t$. It handles three cases: zero returns "0.00"; whole numbers append ".00"; numbers with exactly one decimal place append a trailing "0". The check temp/INT temp=1 is used to test for whole-number values — a common Sinclair BASIC idiom. Note that this routine does not handle values already having two decimal places correctly in all rounding scenarios, which could cause display anomalies for amounts like $1.23.
UDG Definition
Line 79 defines a User Defined Graphic for character "u" using eight bytes of binary DATA read from line 9989. The shape encodes a small checkmark or tick symbol (binary pattern 00000010, 00000100, 10001000, 01010000, 00100000). This UDG is subsequently used in the reconciliation module at line 5115 and 5192 to mark transactions that appear on the bank statement, stored in r$(e) as "\u".
Check Register Balance Calculation
Rather than storing numeric balances directly, the program builds a string expression in g$(d) at lines 3050–3055. For deposits this is STR$ bal + f$(d) (e.g., "1000.00+500.00"); for checks it prepends a negation term involving the per-check charge i$. The running balance is then recovered with VAL g$(e) at display time. This approach lets the program store a self-describing arithmetic expression rather than recomputing balances during review.
Reconciliation Module
The reconciliation routine at lines 5100–5300 iterates through all transactions and accumulates the total of unreconciled items in bb. For each unreconciled check or deposit, it subtracts the per-check charge by evaluating VAL (f$(e)+"-"+i$). The final reconciled balance is computed as cs + bb where cs is the statement closing balance. A congratulations message is shown if STR$ recon = STR$ bal — using string comparison to avoid floating-point equality pitfalls.
Graphical Monthly Grid
The category review at lines 2060–2150 draws a 3×4 grid using PLOT and DRAW commands to create a visual table of monthly totals. Screen coordinates for each cell are read from DATA at line 9995, which stores 24 row/column pairs (two per month). This separates layout data from display logic neatly.
Key BASIC Idioms
GO SUB 9996is a triple-beep audio cue signaling the user to provide input; it appears before nearly everyINPUTstatement.ON ERR GO TO 9999at line 1 andON ERR GO TO 79at line 80 provide global error recovery, looping back to initialization or the post-setup point respectively.LET d=0: LET b=d: LET c=dat line 17 uses assignment chaining from a single zero to initialize multiple variables efficiently.SAVE y$ LINE 9090at line 9080 saves the program with the user-entered year as the filename and auto-runs from line 9090, which jumps to the post-initialization setup at line 79.- The hidden option
q$="l"at line 640 branches to line 5900, which requires a second input of"l"before executingON ERR RESET : STOP— a deliberate multi-step soft reset guard.
Notable Anomalies
- Lines 2477–2490 contain unreachable code: line 2475 ends with
GO TO 1350, so lines 2480 and 2490 are never executed. - Line 8500 is part of a
FOR b=1 TO 20 ... NEXT bloop (lines 8500–8720) but the loop body ends mid-routine andNEXT bappears at line 8720 after theGO TO 80guard at line 8680, meaning a full 20-file initialization always runs on first entry but subsequent calls via line 8665 skip to mid-loop. - The
GO SUB 9150copy-prompt at line 1346 is followed byINPUT ""which consumes a keypress; the copy flagp$set in subroutine 9150 then drives theCOPYandLPRINTpath. - Line 3555 is referenced by
GO TO 3555at line 5095 but does not exist in the listing; control will fall through to the next available line (3560), which prints a “not found” message — an intentional fall-through technique.
Content
Source Code
1 ON ERR GO TO 9999: BRIGHT 0: BORDER 2: PAPER 2: INK 6: CLS : PRINT AT 1,3;" FINANCIAL RECORD KEEPER ";TAB 3; BRIGHT 1;"\* 1983, Mark L. Fendrick "; BRIGHT 0
2 PRINT '" This program allows you to keep track of all income and payments made during the year. Follow all instructions, and you will have the whole year at a glance."
3 PRINT AT 11,2;"In a moment you will be asked to "; FLASH 1;"Enter"; FLASH 0;" the year. When you are asked to "; FLASH 1;"Enter"; FLASH 0;" information, first type the requested data, and then press the "; BRIGHT 1;"Enter"; BRIGHT 0;" key. When you are asked to "; FLASH 1;"Press"; FLASH 0;" an answer--do not";CHR$ 8;CHR$ 8;CHR$ 8; OVER 1;"___"; OVER 0;" press the "; BRIGHT 1;"Enter"; BRIGHT 0;" key."
10 LET q$="": DIM a$(12,9): DIM b$(20,15): DIM m(12,20)
11 FOR z=1 TO 12: READ a$(z): NEXT z
12 DATA "January","February","March","April","May","June","July","August","September","October","November","December"
14 FOR z=1 TO 20: LET b$(z)="File # "+STR$ z: NEXT z
17 LET d=0: LET b=d: LET c=d: LET u$=""
21 DIM c$(350,8): DIM d$(350,4): DIM e$(350,20): DIM f$(350,7): DIM g$(350,20)
26 LET bal=d
27 DIM r$(350,1): DIM t(20)
77 PRINT FLASH 1;AT 21,0;"Enter"; FLASH 0;" year"
78 GO SUB 9996: INPUT y$: LET y$=y$+" ": LET y$=y$( TO 4)
79 POKE 23609,30: RESTORE 9989: FOR z=0 TO 7: READ f: POKE USR "u"+z,f: NEXT z: IF q$="8" THEN LET d=d-1
80 ON ERR GO TO 79: BORDER 7: PAPER 7: INK 0: CLS
100 PRINT '"********************************"
110 PRINT "*"; PAPER 6;" R E C O R D S F O R ";y$;" "; PAPER 7;"*"
120 PRINT "********************************"
130 PRINT "Select and "; FLASH 1; INK 3;"PRESS"; INK 0; FLASH 0;" application no."
140 PRINT "********************************"
160 PRINT INK 1;'"1) Update file"'"2) Review file"'"3) Category totals by month"'"4) Year to date income/payments"'"5) Review tax deductions"'"6) Define file names"'"7) File maintenance"
170 PRINT INK 2;"8) Enter checks and deposits"'"9) Review check listing"'"0) Year to date by endorsee"'"A) Reconcile checking account"' INK 4;"B) Save to tape"
180 PRINT PAPER 6; INK 0;AT 21,2;" \* 1983, Mark L. Fendrick ": GO SUB 9996
490 LET q$=INKEY$: IF q$="" THEN GO TO 490
495 BRIGHT 0
500 IF q$="1" THEN GO TO 1000
510 IF q$="2" THEN GO TO 1000
520 IF q$="3" THEN GO TO 2000
550 IF q$="5" THEN GO TO 6000
560 IF q$="4" THEN GO TO 2300
570 IF q$="6" THEN GO TO 8665
580 IF q$="a" THEN GO TO 5100
590 IF q$="7" THEN GO TO 2600
600 IF q$="8" THEN GO TO 3120
610 IF q$="9" THEN GO TO 5000
620 IF q$="0" THEN GO TO 4000
630 IF q$="b" THEN GO TO 9000
640 IF q$="l" THEN GO TO 5900
700 GO TO 490
1000 BORDER 5: PAPER 5: INK 1: CLS
1005 PRINT 'TAB 8;y$;TAB 8;"\''\''\''\''"
1010 PRINT '" Select desired month"'" and "; FLASH 1;"ENTER"; FLASH 0;" number"''" 1) January"'" 2) February"'" 3) March"'" 4) April"'" 5) May"'" 6) June"'" 7) July"'" 8) August"'" 9) September"'" 10) October"'" 11) November"'" 12) December"
1020 GO SUB 9996: INPUT a: IF a<1 OR a>12 THEN GO TO 1020
1040 CLS
1100 BORDER 6: PAPER 6: CLS : GO SUB 9200
1110 PRINT AT 0,0;a$(a, TO 3);"."; INK 0;"INC$";inc; INK 2;" PAY$";pay'': BEEP .05,10
1120 FOR z=1 TO 20
1122 LET temp=ABS m(a,z): GO SUB 9990
1125 IF m(a,z)<0 THEN INK 2
1126 IF m(a,z)>=0 THEN INK 0
1130 PRINT z;")";TAB 4;b$(z);TAB 28-LEN t$;"$";t$;TAB 30;z: BEEP .05,10
1140 NEXT z: INK 1: IF q$="2" THEN GO TO 1346
1310 GO SUB 8000
1330 IF NOT c THEN GO TO 80
1335 PRINT AT c+1,0;" "
1336 IF m(a,c)<0 THEN INK 2
1337 IF m(a,c)>=0 THEN INK 0
1338 LET temp=ABS m(a,c): GO SUB 9990
1340 PRINT AT c+1,0;c;")";TAB 4;b$(c);TAB 28-LEN t$;"$";t$;TAB 30;c
1341 IF u$="i" THEN LET inc=inc+temp1
1342 IF u$="p" THEN LET pay=pay+ABS temp1
1343 PRINT AT 0,0;a$(a, TO 3);"."; INK 0;"INC$";inc; INK 2;" PAY$";pay
1345 INK 1: GO TO 1310
1346 GO SUB 9150: INPUT "": IF p$="y" THEN COPY : LPRINT '''''
1350 IF INKEY$<>"" THEN GO TO 1350
1351 INPUT "": PRINT #0; PAPER 7; INK 2; FLASH 1;"Press any key to go to the menu.": GO SUB 9996
1360 IF INKEY$="" THEN GO TO 1360
1370 GO TO 80
2000 PAPER 7: INK 1: BORDER 7: CLS
2010 PRINT TAB 3; PAPER 2; INK 7; FLASH 1;" ENTER # of desired file. "
2030 FOR z=1 TO 20: PRINT TAB 4;z;")";TAB 8;b$(z): BEEP .01,20: NEXT z
2057 PRINT AT 21,0; FLASH 1; PAPER 2; INK 7;"ENTER ""0"" to return to the menu.": GO SUB 9996: INPUT f: IF f<0 OR f>20 THEN GO TO 2057
2058 IF f=0 THEN GO TO 80
2060 BORDER 5: PAPER 5: INK 1: CLS
2075 PRINT TAB 5; PAPER 6; INK 1;" ";b$(f);" ";y$;" "
2080 PRINT AT 2,1;"January";TAB 11;"February";TAB 21;"March"''''" April";TAB 11;"May";TAB 21;"June";''''" July";TAB 11;"August";TAB 21;"September"''''" October";TAB 11;"November";TAB 21;"December"
2090 PLOT 2,32: DRAW 0,128: DRAW 251,0: DRAW 0,-128: DRAW -251,0: PLOT 2,64: DRAW 251,0: PLOT 2,96: DRAW 251,0: PLOT 2,130: DRAW 251,0: PLOT 84,160: DRAW 0,-128: PLOT 164,160: DRAW 0,-128
2100 RESTORE 9995: FOR z=1 TO 12: LET temp=ABS m(z,f): GO SUB 9990: READ x1,y1: PRINT AT x1,y1;"$";t$: BEEP .01,30: NEXT z
2115 LET yr=0
2120 FOR z=1 TO 12: LET yr=yr+m(z,f): NEXT z
2130 LET temp=ABS yr: GO SUB 9990
2150 LET t$=" Total for "+y$+":$"+t$+" ": PRINT AT 19,(31-LEN t$)/2; PAPER 6; INK 1;t$: GO SUB 9150
2160 INPUT "": IF p$="y" THEN COPY
2170 GO SUB 9300
2180 IF q$="2" THEN GO TO 80
2190 GO TO 2000
2300 BORDER 6: PAPER 6: INK 0: CLS
2310 PRINT AT 1,0;" ": LET ytdi=0: LET ytdp=0
2410 FOR f=1 TO 20
2420 LET ytdf=0
2430 FOR z=1 TO 12
2435 IF m(z,f)>0 THEN LET ytdi=ytdi+m(z,f)
2436 IF m(z,f)<0 THEN LET ytdp=ytdp+m(z,f)
2440 LET ytdf=ytdf+m(z,f)
2450 NEXT z
2453 IF ytdf>=0 THEN INK 1
2454 IF ytdf<0 THEN INK 2
2455 LET temp=ABS ytdf: GO SUB 9990
2460 PRINT b$(f);TAB 15;" ytd:";TAB 29-LEN t$;"$";t$: BEEP .02,10
2470 NEXT f
2475 PRINT AT 0,0; INK 7; PAPER 4;"Inc:$";ytdi,"Pay:$";ABS ytdp: GO SUB 9150: INPUT "": IF p$="y" THEN LPRINT INVERSE 1;" Year to date for ";y$;" ": COPY : LPRINT '''''
2477 GO TO 1350
2480 IF INKEY$="" THEN GO TO 2480
2490 GO TO 80
2600 BORDER 4: PAPER 4: INK 7: CLS
2610 PRINT '"Do you want to change a file name (n), an amount (a), or a tax deduction (t)?"'' FLASH 1;"PRESS"; FLASH 0;" ""m"" to return to menu.": GO SUB 9996
2620 LET q$=INKEY$: IF q$="" THEN GO TO 2620
2630 IF q$<>"m" AND q$<>"t" AND q$<>"a" AND q$<>"n" THEN GO TO 2620
2650 IF q$="n" THEN GO TO 2700
2660 IF q$="t" OR q$="a" THEN GO TO 2800
2665 IF q$="m" THEN GO TO 80
2700 CLS : PRINT AT 9,10; FLASH 1;"ENTER"; FLASH 0;" file #"
2710 GO SUB 9996: INPUT f: IF f<1 OR f>20 THEN GO TO 2710
2720 CLS : PRINT AT 9,0; INVERSE 1;b$(f)
2730 PRINT '' FLASH 1;"ENTER"; FLASH 0;" new file name.": GO SUB 9996: INPUT b$(f): GO TO 2600
2800 CLS : PRINT '''TAB 10; FLASH 1;"ENTER"; FLASH 0;" file #"
2820 GO SUB 9996: INPUT f: IF f<1 OR f>20 THEN GO TO 2820
2830 CLS : PRINT '''TAB 6; INVERSE 1;b$(f): IF q$="t" THEN GO TO 2970
2850 PRINT '' FLASH 1;"ENTER"; FLASH 0;" month # (1 TO 12)"
2870 GO SUB 9996: INPUT a: IF a<1 OR a>12 THEN GO TO 2870
2875 CLS : PRINT ''TAB 6; INVERSE 1;b$(f); INVERSE 0''TAB 9; INVERSE 1;a$(a)
2890 PRINT AT 8,7; FLASH 1;"ENTER"; FLASH 0;" new amount": GO SUB 9996: INPUT m(a,f): PRINT '''TAB (26-LEN STR$ m(a,f))/2; INVERSE 1;"$";ABS m(a,f): IF NOT m(a,f) THEN GO TO 2600
2920 PRINT AT 8,0; FLASH 1;"PRESS"; FLASH 0;" ""p"" for payment or ""i"" for income": GO SUB 9996
2930 LET q$=INKEY$: IF q$="" THEN GO TO 2930
2950 IF q$="p" THEN LET m(a,f)=-m(a,f)
2960 GO TO 2600
2970 PRINT ''"Current amount is: $";t(f): PRINT '' FLASH 1;"ENTER"; FLASH 0;" corrected amount": GO SUB 9996: INPUT t(f): GO TO 2600
3000 FOR d=1 TO 350
3001 BORDER 4: PAPER 4: INK 7: CLS : LET temp=bal: GO SUB 9990
3002 PRINT '" Last transaction: ": IF d>1 THEN PRINT d$(d-1);TAB 11;e$(d-1)'c$(d-1);TAB 21;"$";f$(d-1,2 TO )
3005 PRINT " Current balance is:$"; INVERSE 1;t$+" "' INVERSE 0;"--------------------------------"
3010 GO SUB 9996: INPUT INK 7; FLASH 1;"ENTER"; FLASH 0;" date ";c$(d): PRINT 'TAB (31-LEN c$(d))/2;c$(d)
3020 GO SUB 9996: INPUT INK 7; FLASH 1;"ENTER"; FLASH 0;" check number ";temp: LET d$(d)=STR$ temp: PRINT 'TAB (31-LEN ("check #"+STR$ temp))/2;"check #";d$(d)
3030 GO SUB 9996: INPUT INK 7; FLASH 1;"ENTER"; FLASH 0;" to whom check is issued"' FLASH 1;"ENTER"; FLASH 0;" ""deposit"" if deposit"'q$: LET e$(d)=q$: PRINT 'TAB (31-LEN q$)/2;q$
3040 IF e$(d, TO 7)="deposit" THEN GO SUB 9996: INPUT INK 7; FLASH 1;"ENTER"; FLASH 0;" amount of deposit $";temp: GO TO 3044
3042 GO SUB 9996: INPUT INK 7; FLASH 1;"ENTER"; FLASH 0;" amount of check $";temp
3044 GO SUB 9990: LET f$(d)=t$: PRINT 'TAB (31-((LEN t$)+1))/2;"$";f$(d)
3046 IF e$(d, TO 7)="deposit" THEN LET f$(d)="+"+f$(d): GO TO 3050
3048 LET f$(d)="-"+f$(d)
3050 LET g$(d)=STR$ bal+f$(d)
3055 IF e$(d, TO 7)<>"deposit" THEN LET g$(d)="-"+i$+"+"+g$(d)
3060 PRINT #0; INK 7;"PRESS ""c"" if correct"'"PRESS ""i"" if incorrect"
3065 GO SUB 9996
3070 LET q$=INKEY$: IF q$<>"i" AND q$<>"c" THEN GO TO 3070
3080 INPUT "": IF q$="i" THEN LET d=d-1: GO TO 3100
3090 LET bal=VAL g$(d)
3100 GO SUB 9300
3110 IF q$="2" THEN GO TO 80
3120 IF NOT d THEN GO SUB 3200: GO TO 3000
3130 IF d=350 THEN PRINT AT 10,8; FLASH 1;"File is full": PAUSE 90: GO TO 80
3140 NEXT d
3200 BORDER 4: PAPER 4: INK 7: CLS
3210 PRINT ''"Enter charge per check: $";: GO SUB 9996: INPUT temp: LET i$=STR$ temp: PRINT i$
3220 PRINT ''"Enter starting balance": GO SUB 9996: INPUT bal: LET temp=bal: GO SUB 9990: PRINT TAB 20;"$";t$
3230 PRINT ''"Press ""c"" if correct"'"Press ""i"" if incorrect": GO SUB 9996
3240 LET q$=INKEY$: IF q$<>"i" AND q$<>"c" THEN GO TO 3240
3250 IF q$="i" THEN GO TO 3200
3260 RETURN
3510 PRINT ''"Enter desired starting check #": GO SUB 9996: INPUT h$: PRINT ''h$
3520 PRINT FLASH 1''"Do you want a copy? (y or n)": GO SUB 9996: GO SUB 9160
3523 IF h$="" THEN LET e=1: GO TO 3600
3525 CLS : PRINT AT 10,5; FLASH 1;"Working--please wait"
3530 FOR e=1 TO d
3535 IF h$="" AND d$(e)=" " THEN GO TO 3600
3536 IF d$(e)=" " THEN GO TO 3550
3540 IF VAL h$=VAL d$(e) THEN GO TO 3600
3550 NEXT e
3560 CLS : PRINT '''''h$;" not found": GO SUB 9300: IF q$="2" THEN GO TO 80
3570 GO TO 5000
3600 CLS : LET z=0
3610 FOR e=e TO d
3615 LET z=z+1
3620 PRINT d$(e);TAB 10;e$(e);" "+r$(e)
3621 IF p$="y" THEN LPRINT d$(e);TAB 10;e$(e);" "+r$(e)
3630 PRINT c$(e);TAB 10;"$";f$(e,2 TO );TAB 20;"$";: LET temp=VAL g$(e): GO SUB 9990: PRINT t$
3631 IF p$="y" THEN LPRINT c$(e);TAB 10;"$";f$(e,2 TO );TAB 20;"$";t$
3632 BEEP .01,10
3635 PRINT "--------------------------------"
3636 IF p$="y" THEN LPRINT "--------------------------------"
3640 IF z=7 THEN PRINT : LET z=0
3649 NEXT e
3650 IF p$="y" THEN LPRINT '''''
3651 GO SUB 9300
3655 IF q$="2" THEN GO TO 80
3670 GO TO 5000
4000 BORDER 6: PAPER 6: INK 1: CLS
4010 PRINT ''"Enter desired name": GO SUB 9996: INPUT h$: PRINT '' INVERSE 1; BRIGHT 1;" ";h$;" ": IF LEN h$>20 THEN LET h$=h$( TO 20)
4040 GO SUB 9996: PRINT ' BRIGHT 1;"Do you want a copy? (y or n)": GO SUB 9160: CLS
4070 PRINT ' INVERSE 1; BRIGHT 1;" ";h$;" "'': IF p$="y" THEN LPRINT '' INVERSE 1;" ";h$;" "''
4075 LET temp1=0
4080 FOR e=1 TO d
4085 LET temp=ABS VAL f$(e): GO SUB 9990
4090 IF h$=e$(e, TO LEN h$) THEN PRINT c$(e);" chk #";d$(e);TAB 30-LEN t$;"$";t$: BEEP .02,10: IF p$="y" THEN LPRINT c$(e);" chk #";d$(e);TAB 30-LEN t$;"$";t$
4100 IF h$=e$(e, TO LEN h$) THEN LET temp1=temp1+ABS VAL f$(e)
4110 NEXT e: LET temp=temp1
4120 GO SUB 9990: PRINT '' INVERSE 1; BRIGHT 1;" ";y$;" total:$";t$;" ": IF p$="y" THEN LPRINT INVERSE 1;''" ";y$;" total:$";t$;" "'''''
4130 GO SUB 9300: IF q$="2" THEN GO TO 80
4140 GO TO 4000
5000 BORDER 1: PAPER 1: INK 7: CLS
5010 PRINT ''"Do you want to start the list with a check number (n) or with a date (d)?": GO SUB 9996
5015 LET q$=INKEY$: IF q$="n" THEN GO TO 3510
5030 IF q$<>"d" THEN GO TO 5015
5040 PRINT ''"Enter desired starting date.": GO SUB 9996: INPUT h$: IF LEN h$>8 THEN LET h$=h$( TO 8)
5050 PRINT ''h$
5060 PRINT '' FLASH 1;"Do you want a copy? (y or n)": GO SUB 9996: GO SUB 9160
5065 IF h$="" THEN LET e=1: GO TO 3600
5070 CLS : PRINT AT 10,5; FLASH 1;"Working--please wait"
5080 FOR e=1 TO d
5085 IF h$=c$(e, TO LEN h$) THEN GO TO 3600
5090 NEXT e
5095 GO TO 3555
5100 BORDER 3: PAPER 3: INK 9: CLS
5105 PRINT AT 6,0;"--------------------------------": LET bb=0
5110 FOR e=1 TO d
5115 IF r$(e)="\u" THEN GO TO 5200
5130 PRINT AT 7,0;d$(e);" "+e$(e);TAB 30;" "'c$(e);TAB 21;"$"+f$(e,2 TO )'"--------------------------------"
5170 PRINT ''"PRESS ""x"" if this check or deposit is on statement."''"PRESS ""n"" if not on statement.": GO SUB 9996
5180 LET r$(e)=INKEY$: IF r$(e)<>"x" AND r$(e)<>"n" THEN GO TO 5180
5192 IF r$(e)="x" THEN LET r$(e)="\u"
5193 PRINT AT 7,30;r$(e): IF r$(e)="n" THEN LET r$(e)=" "
5197 IF r$(e)<>"\u" THEN LET bb=bb+VAL (f$(e)+"-"+i$)
5199 IF INKEY$<>"" THEN GO TO 5199
5200 NEXT e
5210 CLS : PRINT '''"ENTER balance from checking statement.": GO SUB 9996: INPUT cs: CLS
5250 LET recon=cs+bb
5260 PRINT AT 10,0;"Your checkbook balance"'"should be: $";recon
5270 IF STR$ recon=STR$ bal THEN PRINT ''TAB 7; FLASH 1;"congratulations"
5280 PRINT ''"PRESS any key to return to menu": GO SUB 9996
5290 IF INKEY$="" THEN GO TO 5290
5300 GO TO 80
5900 INPUT q$: IF q$<>"l" THEN GO TO 490
5910 ON ERR RESET : STOP
6000 BORDER 3: PAPER 3: INK 9: CLS : LET tot=0
6010 PRINT PAPER 6; INK 1;" Deductable for ";y$;":$"''
6020 FOR z=1 TO 20
6025 LET temp=ABS t(z): GO SUB 9990
6030 PRINT b$(z);TAB 29-LEN t$;"$";t$: BEEP .02,10: LET tot=tot+ABS t(z)
6040 NEXT z
6050 PRINT AT 0,22; PAPER 6; INK 1;tot;" "
6060 GO SUB 9150: INPUT "": IF p$="y" THEN COPY : LPRINT '''''
6070 GO TO 1350
8000 GO SUB 9996: INPUT FLASH 1;"ENTER"; FLASH 0;" line # or ""0"" for menu ";c: INPUT "": LET p$="n": IF c<0 OR c>20 THEN GO TO 8000
8005 IF NOT c THEN RETURN
8010 LET hold=m(a,c)
8015 PRINT AT c+1,3; FLASH 1;"\u"
8020 IF NOT c THEN RETURN
8023 PRINT #0; FLASH 1;"PRESS"; FLASH 0;" income (i) or payment (p)": GO SUB 9996
8024 LET u$=INKEY$: IF u$<>"i" AND u$<>"p" THEN GO TO 8024
8027 INPUT "": IF u$="i" AND t(c) THEN PRINT #0;"Deductable adjustment? "; FLASH 1;"(y or n)": GO SUB 9996
8028 IF u$="p" THEN PRINT #0;"Is this tax deductable? "; FLASH 1;"(y or n)": GO SUB 9996
8029 IF t(c) OR u$="p" THEN LET p$=INKEY$: IF p$<>"y" AND p$<>"n" THEN GO TO 8029
8032 GO SUB 9996: INPUT FLASH 1;"ENTER"; FLASH 0;" amount $";m(a,c): LET temp1=m(a,c)
8042 IF u$="p" THEN LET temp1=-temp1
8043 IF u$="p" AND p$="y" THEN LET t(c)=t(c)+m(a,c): GO TO 8046
8045 IF t(c) AND p$="y" THEN LET t(c)=t(c)-m(a,c)
8046 LET m(a,c)=temp1+hold
8190 RETURN
8500 FOR b=1 TO 20
8510 PRINT AT 9,5; FLASH 1;"ENTER"; FLASH 0;" name for file #";b: GO SUB 9996: INPUT t$: LET b$(b)=t$: PRINT ''TAB (31-LEN t$)/2;t$
8520 GO SUB 9300: IF q$="2" THEN GO TO 80
8665 BORDER 1: PAPER 1: INK 7: CLS
8670 IF NOT b THEN GO TO 8500
8680 IF b=20 THEN PRINT AT 10,8; FLASH 1;"FILE IS FULL": PAUSE 90: GO TO 80
8720 NEXT b
9000 BORDER 0: PAPER 0: INK 7: CLS
9010 PRINT ''"Make sure that tape is set to the desired position, and that wires are properly connected."
9020 PRINT ''"Press "; FLASH 1;"PLAY"; FLASH 0;" and "; FLASH 1;"RECORD"; FLASH 0;" on the tape recorder."
9030 PRINT ''"To reLOAD this program, type -";TAB 9;"LOAD """;y$;""""
9040 PRINT ''"PRESS ""s"" to SAVE"''"PRESS ""m"" to return to menu": GO SUB 9996
9050 LET q$=INKEY$: IF q$<>"s" AND q$<>"m" THEN GO TO 9050
9060 IF q$="m" THEN GO TO 80
9070 CLS : PRINT AT 10,13; FLASH 1;"SAVING": GO SUB 9996
9080 SAVE y$ LINE 9090
9090 GO TO 79
9150 PRINT #0; PAPER 7; INK 2; FLASH 1;" Do you want a copy? (y or n) ": GO SUB 9996
9160 LET p$=INKEY$: IF p$<>"y" AND p$<>"n" THEN GO TO 9160
9170 RETURN
9200 LET inc=0: LET pay=0
9205 FOR z=1 TO 20
9210 IF m(a,z)>0 THEN LET inc=inc+m(a,z)
9220 IF m(a,z)<0 THEN LET pay=pay+ABS m(a,z)
9230 NEXT z
9240 RETURN
9300 PRINT #0;AT 0,0; FLASH 1; PAPER 2; INK 7;" PRESS 1 to repeat procedure PRESS 2 to return to the menu ": GO SUB 9996
9310 LET q$=INKEY$: IF q$<>"1" AND q$<>"2" THEN GO TO 9310
9315 GO TO 9330
9320 LET q$="2"
9330 RETURN
9989 DATA BIN 00000000,BIN 00000000,BIN 00000010,BIN 00000100,BIN 10001000,BIN 01010000,BIN 00100000,BIN 00000000
9990 IF temp=0 THEN LET t$="0.00": RETURN
9991 LET t$=STR$ temp: IF temp/INT temp=1 THEN LET t$=t$+".00": RETURN
9992 LET temp=temp*10: IF temp/INT temp=1 THEN LET t$=t$+"0"
9993 RETURN
9995 DATA 4,1,4,11,4,21,8,1,8,11,8,21,12,1,12,11,12,21,16,1,16,11,16,21
9996 BEEP .05,12: BEEP .05,12: BEEP .05,12: RETURN
9998 SAVE "frk" LINE 9999
9999 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.


