Tax Records

Date: 198x
Type: Program
Platform(s): TS 2068
Tags: Tax

Keeps track of tax records by category, so that receipts filed in labeled envelopes can be totaled at the end of the year. A table of contents in lines 500–999 lists headings for income, deductions, credits and estimated-tax payments, each with the line number where its entries are kept. Entries are typed into the program as strings: the first five characters of each entry are the amount, followed by a description, with entries separated by an asterisk. A subroutine at line 100 splits the string apart, prints each entry, and prints a total for the category, on screen and on a printer.

The tape is the author’s working copy of a magazine article, "Systematize Your Tax Records" by Basil Wentworth. It holds four files:

  • tax: Wentworth’s own full-screen text editor, saved with the first part of the article text in memory.
  • tax2: a character array holding the rest of the article, about 4,000 characters, which loads into the editor with LOAD DATA.
  • taxfig: prints the article’s three figures: the table of contents, a partial print-out with sample entries (LOCAL BANK, CHARITY 1 and so on), and the strings used to produce it.
  • taxlist: the tax-record program itself, with sample entries, and an option to LLIST it to a printer. The sample entries also cover a non-cash contribution and estimated federal and state tax payments.

The article explains that the program uses strings and a subroutine rather than READ/DATA so that it runs unchanged on the TS1000 and the TS2068. It also says the entries shown are only a sample, not a full record.

Program Analysis

The Record Program (taxlist)

Lines 100–280 do all the work. A$( TO 5) is taken as the amount with VAL and added to a running total. The rest of the string is then printed one character at a time until an asterisk starts the next entry. Each category is a short block of lines such as 1210 LET A$=" 153LOCAL BANK* 12OTHER BANK" followed by GO SUB 100, so a long category can be split across several LET A$=A$+... lines. Negative amounts are allowed with a leading minus sign. The user runs a category with GO TO its line number, which the table of contents lists.

The Text Editor (tax)

The editor keeps the whole document in A$ and shows a 320-character window of it, with the cursor marked by a character inserted into the display copy. Keys 1–9 move the window down by that many lines, 0 moves it back ten, shifted 5–8 move the cursor, shifted 0 deletes, and ENTER inserts typed text. A menu offers clear, enter/edit, delete/move a marked passage, proofread, LOAD and SAVE of the text as a string array, print, and SAVE of the program. Before a block is deleted or moved, the editor shows the result with up to 250 characters on either side and asks for confirmation. Typing FORMAT or FORMAT 1 as a line of text inserts a stored address block or closing signature.

The print section is marked in a REM as "Woods software". It asks for the margin, one of eight pitch settings (compressed, proportional, elite or pica, normal or elongated), normal or bold strike, line length and line spacing. These are sent to the printer as ESC sequences: ESC L for the margin, ESC Q/P/E/N for pitch with CHR$ 14/CHR$ 15 for elongated, and ESC T for line spacing. The maximum line length for each pitch is worked out from the margin.

Notable Techniques

  • Word wrap is done by a 37-byte machine-code routine. After CLEAR, DIM X$(190) is created first so that it sits at the start of the variables area. Lines 9900–9950 are read into X$(150) onward, with ON ERR catching the end of the DATA. Line 8670 then calls the code with USR (a+155), where a is read from VARS (23627). The line length goes in X$(159). The routine scans back from the end of the line for a space or a :' paragraph mark (character 139) and returns the break position.
  • A blank ENTER inserts character 139 as a paragraph mark, and the print routine breaks lines there.
  • GO TO 1000*VAL INKEY$ sends a menu key straight to its section at line 1000, 3000, 4000 and so on.
  • In taxfig, the "COPY" in its printer note is underlined by printing each letter, backspacing with CHR$ 8 and printing an underscore with OVER 1.

Potential Issues

  • taxfig shows the OTHER BANK interest as 120, while the taxlist version of the same line has 12.
  • Several jumps in the editor (GO TO 1030, GO SUB 1030, menu key 1 to line 1000) point at lines that don’t exist. They work because BASIC carries on at the next line.

Image Gallery

Source Code

## Program "tax" (autostart 1)
   10 GO TO 600
   20 REM SUB INKEY$
   30 IF INKEY$="" THEN GO TO 30
   35 LET P=CODE INKEY$
   40 RETURN 
   45 REM SUB CONFIRM
   50 IF INKEY$<>"" THEN GO TO 50
   55 PRINT ''"To CONFIRM, press ""C""": GO SUB 20
   60 LET CO=(P=67)+(P=99): RETURN 
   65 REM GO SUB LIMITS
   70 IF N1<1 THEN LET N1=1
   75 IF N1>LEN A$ THEN LET N1=LEN A$
   80 LET N2=N1+318
   85 IF N2>LEN A$ THEN LET N2=LEN A$
   90 IF CU<N1-1 THEN LET CU=N1-1
   95 IF CU<1 THEN LET CU=1
  100 IF CU>N2 THEN LET CU=N2
  110 RETURN 
  120 REM LEGENDS
  125 PRINT AT 13,0;LEN A$-1,"LINE NO. ";1+INT (N1/32)
  130 PRINT '"1-9 advances line; 0 back 10"
  135 PRINT "Shifted 5-8 MOVES cursor"
  140 PRINT "Shifted 0 DELETES character"
  145 PRINT "Shifted 1 gives MENU"
  150 PRINT L$
  155 RETURN 
  600 REM MENU
  605 CLS 
  610 PRINT '"FOR:","PRESS:"
  615 PRINT '"CLEAR","CLEAR"
  620 PRINT '"ENTER/EDIT",1
  625 PRINT 
  630 PRINT "DELETE/MOVE",3
  635 PRINT "PROOFREAD",4
  640 PRINT "LOAD "; BRIGHT 1;"data"; BRIGHT 0,5
  645 PRINT '"SAVE "; BRIGHT 1;"data"; BRIGHT 0,7
  650 PRINT "PRINT",8
  655 PRINT "SAVE "; BRIGHT 1;"program"; BRIGHT 0,9
  700 GO SUB 20
  705 LET CO=0
  710 IF P>48 AND P<58 THEN GO TO 1000*VAL INKEY$
  890 IF P<>88 AND P<>120 THEN GO TO 600
  895 CLS : PRINT '"CLEAR- ": GO SUB 50
  900 GO TO 600+350*CO
  945 REM CLEAR
  950 CLEAR : PRINT ''"Stand by for just a moment"
  955 DIM X$(190)
  960 RESTORE : FOR F=150 TO 190: READ A: ON ERR GO TO 970
  965 LET X$(F)=CHR$ A: NEXT F
  970 ON ERR RESET 
  980 LET a$=CHR$ 128: LET N1=1: LET CU=1
  985 LET MA=10: LET TY=4: LET ST=1
  990 LET LL=65: LET LS=1: LET RE=1
 1005 LET Z$="L"
 1015 LET L$="Press ""ENTER"" to add text."
 1020 LET MO=1
 1045 GO SUB 65
 1050 CLS : PRINT 'A$(N1 TO CU);Z$;A$(CU+1 TO N2)
 1055 GO SUB 120
 1065 REM MOVE WINDOW
 1070 GO SUB 20
 1075 IF P=7 THEN GO TO 600
 1100 IF P=13 AND MO=3 THEN LET A$=A$( TO CU)+">"+A$(CU+1 TO )
 1105 IF P=13 AND MO=4 THEN LET A$=A$( TO CU)+"<"+A$(CU+1 TO )
 1110 IF P<48 OR P>57 THEN GO TO 1150
 1125 LET N1=N1+32*VAL INKEY$-320*(P=48)
 1130 LET CU=CU+32*VAL INKEY$-320*(P=48)
 1135 GO TO 1030
 1150 REM MOVE CURSOR
 1155 IF (P<8 OR P>11) AND P<>37 AND P<>40 THEN GO TO 1200
 1160 LET CU=CU+(P=9)-(P=8)+5*((P=40)-(P=37))+32*((P=10)-(P=11))
 1165 IF CU<N1 THEN LET N1=CU
 1170 IF CU>N2 THEN LET N1=CU-319
 1180 GO TO 1030
 1200 REM ADD TEXT
 1205 IF P<>13 AND P<>42 THEN GO TO 1250
 1215 IF MO<>1 THEN RETURN 
 1220 INPUT T$
 1225 GO SUB 7200
 1235 LET A$=A$( TO CU)+T$+A$(CU+1 TO )
 1240 LET CU=CU+LEN T$: LET N2=N2+LEN T$: LET N1=N2-318
 1245 GO TO 1000
 1250 REM DELETE
 1255 IF P<>12 THEN GO TO 1030
 1260 LET A$=A$( TO CU-1)+A$(CU+1 TO )
 1270 LET CU=CU-1
 1280 GO TO 1030
 1999 STOP 
 2000 GO TO 600
 3000 REM DELETE/MOVE
 3005 LET MO=3
 3010 LET Z$=">"
 3020 LET L$="Press ""ENTER"" to mark START of     passage to be moved."
 3030 GO SUB 1030
 3040 LET D1=CU
 3100 LET Z$="<"
 3105 LET MO=4
 3110 LET L$="Press ""ENTER"" to mark END of        passage to be moved."
 3120 GO SUB 1030
 3130 LET D2=CU
 3140 IF D1>D2 THEN CLS : PRINT '' BRIGHT 1;"You have asked for the end to bebefore the start.  Try again.   ": GO TO 610
 3150 LET Z$="^"
 3155 LET MO=5
 3160 LET L$="Press ""ENTER"" to mark point of     insertion; ""*"" to DELETE"
 3170 GO SUB 1030
 3180 LET D3=CU
 3195 REM DELETE
 3200 IF P=13 THEN GO TO 3300
 3210 LET ND1=D1-250: IF ND1<1 THEN LET ND1=1
 3215 LET ND2=D2+250: IF ND2>LEN A$ THEN LET ND2=LEN A$
 3220 CLS : PRINT A$(ND1 TO D1)+A$(D2+2 TO ND2)
 3230 GO SUB 50
 3235 IF NOT CO THEN GO TO 3000
 3240 LET A$=A$( TO D1)+A$(D2+2 TO )
 3250 GO TO 1000
 3299 REM MOVE TEXT BACKWARD
 3300 IF D3>=D2 THEN GO TO 3400
 3310 LET ND1=D3-250: IF ND1<1 THEN LET ND1=1
 3315 LET ND2=D2+250: IF ND2>LEN A$ THEN LET ND2=LEN A$
 3320 CLS : PRINT A$(ND1 TO D3)+A$(D1+2 TO D2)+A$(D3+1 TO D1)+A$(D2+2 TO ND2)
 3330 GO SUB 50
 3335 IF NOT CO THEN GO TO 3000
 3340 LET A$=A$( TO D3)+A$(D1+2 TO D2)+A$(D3+1 TO D1)+A$(D2+2 TO )
 3350 GO TO 1000
 3409 REM MOVE TEXT FORWARD
 3410 LET ND1=D3-250: IF ND1<1 THEN LET ND1=1
 3415 LET ND2=D2+250: IF ND2>LEN A$ THEN LET ND2=LEN A$
 3420 CLS : PRINT A$(ND1 TO D1)+A$(D2+2 TO D3)+A$(D1+2 TO D2)+A$(D3+1 TO ND2)
 3430 GO SUB 50
 3435 IF NOT CO THEN GO TO 3000
 3440 LET A$=A$( TO D1)+A$(D2+2 TO D3)+A$(D1+2 TO D2)+A$(D3+1 TO )
 3450 GO TO 1000
 4000 REM PROOFREAD
 4005 CLS 
 4010 LET LL=32
 4020 LET HA=0: LET FB=N1
 4030 GO TO 8605
 5000 REM LOAD data
 5005 CLS : PRINT '"Loading "; BRIGHT 1;"data"; BRIGHT 0;''"Start tape"
 5010 LOAD "" DATA W$()
 5015 LET A$=W$
 5020 DIM W$(1)
 5025 BEEP .3,12: BEEP 1,12
 5030 LET N1=1
 5040 LET N2=320
 5050 IF N2>LEN A$ THEN LET N2=LEN A$
 5060 LET SC=1
 5100 GO TO 1
 6000 GO TO 600
 7000 REM SAVE data
 7010 LET SA=7
 7020 DIM W$(LEN A$)
 7030 LET W$=A$
 7040 CLS : PRINT AT 3,6; BRIGHT 1;"DATA"
 7100 GO TO 9015
 7200 REM PRE-FABS
 7210 IF T$="" THEN LET T$=":'"
 7220 IF T$=" FORMAT " THEN GO TO 7950
 7225 IF T$=" FORMAT 1" THEN GO TO 7980
 7230 IF T$=" CAT " THEN LET T$=" :'                            "
 7900 RETURN 
 7950 LET Z$=" :'                            "
 7955 LET T$=Z$+"[address removed]"
 7960 LET T$=T$+Z$+"[address removed]"
 7965 LET T$=T$+Z$+"[phone removed]"
 7975 RETURN 
 7980 LET Z$=" :':':':'                            "
 7985 LET T$=Z$+"Yours truly,"+Z$
 7990 LET T$=T$+"Basil Wentworth"
 7995 RETURN 
 8000 REM  PRINT (Woods software)
 8010 CLS : PRINT ''"Hard copy?   Y-  N-     "
 8020 GO SUB 20
 8030 PRINT AT 2,20; BRIGHT 1;INKEY$: LET HA=(INKEY$="y")+(INKEY$="Y")
 8040 GO SUB 50: IF NOT CO THEN GO TO 8000
 8050 IF NOT HA THEN GO TO 8500
 8060 REM  Margin
 8065 CLS : PRINT '' FLASH 1;"Be sure"; FLASH 0;" that Printer power"
 8070 PRINT "and SEL are ON"
 8075 PRINT ''"Margin set at   "; BRIGHT 1;MA; BRIGHT 0;"     "
 8080 GO SUB 8990
 8085 IF Z$<>"" THEN LET MA=VAL Z$: GO TO 8060
 8090 LPRINT CHR$ 27;"L0";STR$ MA;
 8095 REM  Type
 8100 CLS : PRINT ''"Type set at   "; BRIGHT 1;TY; BRIGHT 0;"     "
 8110 PRINT ''"1. Compressed"'"2. Proportional"'"3. Elite"'"4. Pica"
 8120 PRINT "5. Elongated compressed"'"6. Elongated proportional"
 8125 PRINT "7. Elongated elite"'"8. Elongated pica"
 8130 GO SUB 8990
 8140 IF Z$<>"" THEN LET TY=VAL Z$: GO TO 8100
 8145 GO TO 8150+TY
 8151 LPRINT CHR$ 15;CHR$ 27;"Q";: GO TO 8160
 8152 LPRINT CHR$ 15;CHR$ 27;"P";: GO TO 8160
 8153 LPRINT CHR$ 15;CHR$ 27;"E";: GO TO 8160
 8154 LPRINT CHR$ 15;CHR$ 27;"N";: GO TO 8160
 8155 LPRINT CHR$ 14;CHR$ 27;"Q";: GO TO 8160
 8156 LPRINT CHR$ 14;CHR$ 27;"P";: GO TO 8160
 8157 LPRINT CHR$ 14;CHR$ 27;"E";: GO TO 8160
 8158 LPRINT CHR$ 14;CHR$ 27;"N";: GO TO 8160
 8180 REM  Bold?
 8190 CLS : PRINT ''"Strike set for "; BRIGHT 1;ST; BRIGHT 0;"   "
 8200 PRINT ''"1.  Normal"'"2.  Bold"
 8205 GO SUB 8990
 8210 IF Z$<>"" THEN LET ST=VAL Z$: GO TO 8190
 8220 IF ST=1 THEN LPRINT CHR$ 27;CHR$ 34;
 8230 IF ST=2 THEN LPRINT CHR$ 27;CHR$ 33;
 8240 REM  LINE LENGTH
 8241 IF TY=1 THEN LET LMAX=130-MA
 8242 IF TY=2 THEN LET LMAX=105-1.5*MA
 8243 IF TY=3 THEN LET LMAX=90-MA
 8244 IF TY=4 THEN LET LMAX=75-MA
 8245 IF TY=5 THEN LET LMAX=65-.5*MA
 8246 IF TY=6 THEN LET LMAX=51-.5*MA
 8247 IF TY=7 THEN LET LMAX=45-.5*MA
 8248 IF TY=8 THEN LET LMAX=36-.5*MA
 8249 LET LL=LMAX
 8250 CLS : PRINT ''"Line length set for "; BRIGHT 1;LL; BRIGHT 0;"   "
 8260 PRINT '"Maximum permissible length is "
 8280 PRINT "     ";LMAX
 8290 GO SUB 8990
 8300 IF Z$="" THEN GO TO 8330
 8305 LET LL=VAL Z$
 8310 IF LL>LMAX THEN LET LL=LMAX
 8320 GO TO 8250
 8330 REM  LINE FEED
 8340 CLS : PRINT ''"Line spacing set at     ";
 8345 PRINT BRIGHT 1;LS; BRIGHT 0;"        "
 8350 GO SUB 8990
 8360 IF Z$="" THEN GO TO 8390
 8370 LET LS=VAL Z$: LET LS=.01*INT (100*LS)
 8380 GO TO 8340
 8390 LET Z$=STR$ INT (24*LS)
 8400 IF VAL Z$<10 THEN LET Z$="0"+Z$
 8410 LPRINT CHR$ 27+"T"+Z$;
 8500 REM  PRINT proper
 8510 CLS : PRINT ''"Start at beginning (1)"
 8520 PRINT "  or resume (2)?        "; BRIGHT 1;RE
 8530 GO SUB 8990
 8550 IF Z$<>"" THEN LET RE=VAL Z$: GO TO 8500
 8560 IF NOT HA THEN LET LL=32: CLS 
 8600 LET FB=2
 8610 IF RE=2 THEN LET FB=N1
 8620 IF A$(LEN A$)<>" " THEN LET A$=A$+" "
 8630 IF LL>LEN A$+1-FB THEN LET LL=LEN A$+1-FB
 8640 LET X$( TO LL)=A$(FB TO )
 8650 LET X$(159)=CHR$ LL
 8660 LET a=PEEK 23627+256*PEEK 23628
 8670 LET B=USR (a+155)
 8680 IF NOT HA THEN PRINT x$( TO B)
 8690 IF HA THEN LPRINT x$( TO B)
 8700 LET FB=FB+B+1
 8710 IF FB<LEN A$ THEN GO TO 8630
 8720 BEEP .3,12: BEEP 1,12: STOP 
 8990 INPUT "If OK, press ""ENTER""; if not,    input new value  ";Z$
 8995 RETURN 
 9000 REM SAVE program
 9005 LET SA=9
 9010 CLS : PRINT AT 3,6; BRIGHT 1;"program"
 9015 PRINT AT 3,0;"SAVE"''"Under what name do you want to    SAVE?"
 9020 INPUT N$
 9030 PRINT ''"Is """;N$;""" OK?"
 9045 GO SUB 45
 9050 IF CO THEN GO TO 9100
 9055 IF SA>8 THEN GO TO 9000
 9060 IF SA<9 THEN GO TO 7000
 9100 CLS : PRINT "SAVE """;N$;""""''"Remove earplug from recorder."
 9120 IF SA>8 THEN SAVE N$ LINE 1
 9130 IF SA<8 THEN SAVE N$ DATA W$()
 9135 BEEP .3,12: BEEP 1,12
 9140 CLS : PRINT ''"To VERIFY, rewind tape, replace earplug, and play tape."
 9150 PRINT ''"If verification fails, GO TO 1   and try again."
 9160 IF SA>8 THEN VERIFY N$
 9165 IF SA<8 THEN VERIFY N$ DATA W$()
 9170 PRINT ' BRIGHT 1;"Verifies OK"
 9175 BEEP .3,12: BEEP 1,12
 9180 STOP 
 9900 DATA 42,75,92,1,4,0,237,74
 9910 DATA 6,17,14,0,35,12,5,40,7
 9920 DATA 62,139,190,40,11,24,244
 9930 DATA 62,32,190,40,4
 9940 DATA 13,43,24,249
 9950 DATA 6,0,13,201


## Program "taxfig" (autostart 1)
   10 CLS : PRINT ''"Suggest using TS 2040 printer,  or other printer with"; OVER 1;" C";CHR$ 8;"_O";CHR$ 8;"_P";CHR$ 8;"_Y";CHR$ 8;"_      capability."
   20 PRINT ''"For FIG 1, GO TO 500"
   30 PRINT ''"For FIG 2, GO TO 1000"
   40 PRINT ''"For FIG 3, GO TO 4000"
   99 STOP 
  100 LET T=0
  110 LET T$=A$( TO 5)
  120 PRINT 
  130 PRINT T$;"   ";
  140 LET T=T+VAL T$
  150 LET A$=A$(6 TO )
  170 LET F=1
  180 IF F>LEN A$ THEN GO TO 260
  190 IF A$(F)<>"*" THEN GO TO 220
  200 LET A$=A$(F+1 TO )
  210 GO TO 110
  220 PRINT A$(F);
  240 LET F=F+1
  250 GO TO 180
  260 PRINT 
  270 PRINT ,,T;"   TOTAL"
  280 RETURN 
  500 CLS : PRINT "CONTENTS         LINE"
  510 PRINT 
  520 PRINT "INCOME           1000"
  530 PRINT "   WAGES         1100"
  540 PRINT "   INTEREST      1200"
  550 PRINT "   DIVIDENDS     1300"
  590 PRINT "DEDUCTIONS"
  630 PRINT "   REAL EST TAX  2300"
  640 PRINT "   SALES TAX     2400"
  650 PRINT "   OTHER TAX     2500"
  660 PRINT "   INTEREST PAID 2600"
  670 PRINT "   MISC          2700"
  680 PRINT "   CONTRIBUTIONS 2800"
  690 PRINT "      CASH"
  700 PRINT "      NON-CASH"
  810 PRINT "CREDITS"
  820 PRINT "   POL CONT      3100"
  960 PRINT "PAYMENTS (E.G. ESTIMATED TAX)"
  970 PRINT "                 8000"
  980 PRINT ''"FIGURE 1. TABLE OF CONTENTS"
  999 STOP 
 1000 CLS 
 1200 PRINT ,,"INTEREST INCOME"
 1210 LET A$="  153LOCAL BANK"
 1220 LET A$=A$+"*  120OTHER BANK"
 1290 GO SUB 100
 2800 PRINT ,,"CONTRIBUTIONS"
 2805 PRINT ,,"   CASH"
 2810 LET A$="   30CHARITY 1 JAN*  100CHARITY 2 MAR"
 2840 GO SUB 100
 3000 PRINT ''"FIGURE 2. PARTIAL PRINT-OUT"
 3999 STOP 
 4000 CLS 
 4010 PRINT '"1200 PRINT ,,""INTEREST INCOME"""
 4040 PRINT "1210 LET A$=""  153LOCAL BANK"""
 4050 PRINT "1220 LET A$=A$+""*  120OTHER BANK"""
 4060 PRINT "1290 GO SUB 100"
 4070 PRINT "2800 PRINT ,,""CONTRIBUTIONS"""
 4080 PRINT "2805 PRINT ,,""   CASH"""
 4090 PRINT "2810 LET A$=""   30CHARITY 1 JAN*  100CHARITY 2 MAR"""
 4100 PRINT "2840 GO SUB 100"
 4200 PRINT '"FIGURE 3. STRINGS FOR FIGURE 2"
 8999 STOP 
 9000 CLS : SAVE "taxfig" LINE 1
 9020 BEEP .3,12: BEEP 1,12
 9030 PRINT ''"Replay tape TO VERIFY "
 9040 VERIFY "taxfig"
 9050 PRINT ''' BRIGHT 1;" VERIFY OK "
 9060 BEEP .3,12: BEEP 1,12


## Program "taxlist" (autostart 1)
    5 CLS : PRINT ''" FOR LPRINT OF LISTING, PRESS     ""ENTER"""
   10 INPUT A$
   15 CLS 
   20 LLIST 49
   25 LPRINT '"LISTING OF TAX RECORD PROGRAM"
   26 STOP 
   29 REM SAVE
   30 CLS : SAVE "taxlist" LINE 1
   35 BEEP .3,12: BEEP 1,12
   40 PRINT "Replay tape TO VERIFY ": VERIFY "taxlist"
   42 PRINT '' BRIGHT 1;" VERIFY OK "
   45 BEEP .3,12: BEEP 1,12
   47 STOP 
   50 GO TO 500
  100 LET T=0
  110 LET T$=A$( TO 5)
  120 PRINT 
  121 LPRINT 
  130 PRINT T$;"   ";
  131 LPRINT T$;"   ";
  140 LET T=T+VAL T$
  150 LET A$=A$(6 TO )
  170 LET F=1
  180 IF F>LEN A$ THEN GO TO 260
  190 IF A$(F)<>"*" THEN GO TO 220
  200 LET A$=A$(F+1 TO )
  210 GO TO 110
  220 PRINT A$(F);
  221 LPRINT A$(F);
  240 LET F=F+1
  250 GO TO 180
  260 PRINT 
  261 LPRINT 
  270 PRINT ,,T;"   TOTAL"
  271 LPRINT ,,T;"   TOTAL"
  280 RETURN 
  500 PRINT "CONTENTS         LINE"
  510 PRINT 
  520 PRINT "INCOME           1000"
  530 PRINT "   WAGES         1100"
  540 PRINT "   INTEREST      1200"
  550 PRINT "   DIVIDENDS     1300"
  580 PRINT 
  590 PRINT "DEDUCTIONS"
  630 PRINT "   REAL EST TAX  2300"
  640 PRINT "   SALES TAX     2400"
  650 PRINT "   OTHER TAX     2500"
  660 PRINT "   INTEREST PAID 2600"
  670 PRINT "   MISC          2700"
  680 PRINT "   CONTRIBUTIONS 2800"
  690 PRINT "      CASH"
  700 PRINT "      NON-CASH"
  800 PRINT 
  810 PRINT "CREDITS"
  820 PRINT "   POL CONT      3100"
  950 PRINT 
  960 PRINT "PAYMENTS (E.G. ESTIMATED TAX)"
  970 PRINT "                 8000"
  999 STOP 
 1200 PRINT ,,"INTEREST INCOME"
 1210 LET A$="  153LOCAL BANK*   12OTHER BANK"
 1290 GO SUB 100
 2800 PRINT ,,"CONTRIBUTIONS"
 2805 PRINT ,,"   CASH"
 2810 LET A$="   30CHARITY 1 JAN*  100CHARITY 2 MAR"
 2840 GO SUB 100
 2850 PRINT ,,"   NON-CASH"
 2860 LET A$="    5COOKIES FOR BAKE SALE JUN"
 2890 GO SUB 100
 8000 PRINT ,,"PAYMENT OF ESTIMATED U.S. TAX"
 8010 LET A$="  634APRIL*  634JUN*  634SEP"
 8090 GO SUB 100
 8500 PRINT ,,"PAYMENT OF ESTIMATED STATE TAX"
 8510 LET A$="  220APRIL*  220JUN*  220SEP"
 8590 GO SUB 100

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.