Financial Record Keeper

Developer(s): Mark Fendrick
Date: 1983
Type: Program
Platform(s): TS 2068
Tags: Finance

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 RangeFunction
1–3Title screen and instructions
10–27Array initialization and month DATA
77–79Year input and UDG definition
80–700Main menu and dispatch
1000–1370Update / review monthly file entries
2000–2190Category totals by month (graphical grid)
2300–2490Year-to-date income/payments summary
2600–2970File maintenance (rename, adjust amounts, tax)
3000–3260Check and deposit entry
3510–3670Review check listing by check number
4000–4140Year-to-date totals by endorsee
5000–5300Review check listing by date / reconciliation
5100–5300Reconcile checking account
6000–6070Tax deduction review
8000–8190Entry subroutine for updating amounts
8500–8720Define file names
9000–9090Save to tape
9150–9330Utility subroutines (copy prompt, repeat/menu prompt)
9989–9999DATA, 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 9996 is a triple-beep audio cue signaling the user to provide input; it appears before nearly every INPUT statement.
  • ON ERR GO TO 9999 at line 1 and ON ERR GO TO 79 at line 80 provide global error recovery, looping back to initialization or the post-setup point respectively.
  • LET d=0: LET b=d: LET c=d at line 17 uses assignment chaining from a single zero to initialize multiple variables efficiently.
  • SAVE y$ LINE 9090 at 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 executing ON 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 b loop (lines 8500–8720) but the loop body ends mid-routine and NEXT b appears at line 8720 after the GO TO 80 guard 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 9150 copy-prompt at line 1346 is followed by INPUT "" which consumes a keypress; the copy flag p$ set in subroutine 9150 then drives the COPY and LPRINT path.
  • Line 3555 is referenced by GO TO 3555 at 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

Appears On

Related Products

File one year of records in 20 user defineable areas. Printer output. Menu driven. Month by month totals, year to...

Related Articles

Related Content

Image Gallery

Financial Record Keeper

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.

Scroll to Top