Dues Tracker (64k)

This file is part of and Timex Sinclair Public Domain Library Tape 1004. Download the collection to get this file.
Developer(s): Tim Ward
Date: 198x
Type: Program
Platform(s): TS 1000
Tags: Database

This program is a membership database manager written for the Timex/Sinclair Users Group of Fort Worth, Texas. It maintains up to 50 records of 200 characters each in a two-dimensional string array, storing fields such as name, address, phone numbers, profession, computer types owned, and dues payment dates. A machine code routine embedded in the REM at line 1 implements a scrollable “spreadsheet” view invoked via RAND USR 16524, allowing cursor-key navigation of the data. The program handles mailing-label printing, dues tracking with year-rollover arithmetic, personalised billing letters in three delinquency tiers, and a two-column formatted membership listing that requires a 240×80 character string array as a print buffer.


Program Analysis

Program Structure

The program is organized as a menu-driven application with a central dispatch loop and separate subroutines for each function. Initialization (lines 1–115) sets up arrays and field definitions; the menu (lines 200–425) uses POKEd cursor highlighting; and the eight main functions occupy lines 430–3690. A pair of utility subroutines at lines 9000–9095 handle Y/N input and dues calculation respectively.

Line RangeFunction
1Machine code in REM (spreadsheet scroller)
5–115Initialization: arrays, field definitions
200–425Main menu with cursor-key navigation
430–670Enter a record
700–1140Change a record
1150–1350Delete a record
1360–1650Sort records
1660–1720View records (calls machine code)
1730–1850Print mailing labels
1860–2820Update membership dues / print billing letters
2830–3500Print membership listing
3510–3690File manipulation (raw LPRINT dump)
3700–3740SAVE to tape
9000–9095Utility: Y/N input, dues arithmetic

Machine Code Routine

The entire scrolling spreadsheet viewer is stored as raw Z80 opcodes in the REM at line 1. It is invoked at line 1710 with RAND USR 16524. The routine reads cursor keys (mapped to directions via the keyboard scan), scrolls the display buffer pointed to by the system variable at address 16396/16397, and returns to BASIC when “9” is pressed. This is a classic technique for embedding machine code invisibly within the program file, using the REM statement’s body as inert storage that survives SAVE/LOAD intact.

Data Model

All member data lives in a single 50×200 character string array A$. Each row is one record; fields are addressed by fixed byte offsets stored in numeric arrays A(14) (start positions) and B(14) (end positions), with lengths in C(14). Field titles are held in B$(14,32). The field layout (derived from the initialisation string at line 30) is:

ColumnsField
1–27First name / Last name
28–60Address
61–93City-State-Zip
94–107Home phone
109–122Work phone
124–155Profession
157–161, 163–167, 169–173Computer types (COMP1/2/3)
175–180M-YJG
181–186M-YDP (dues paid month-year)
187–192MYDPT (dues paid through)
193–200+PC field

Menu Navigation Technique

Rather than using INPUT for menu selection, lines 260–310 implement a cursor that physically moves through the display using POKE and PEEK. The current cursor position is computed as an offset from the system display file address (PEEK 16396 + 256*PEEK 16397) and a character at that address is toggled between 0 (normal space) and 128 (inverse space). Keys “7” and “6” move the cursor up and down by 66 bytes (two display lines = one menu row). Key “9” confirms the selection. The dispatch at lines 330–420 compares the cursor address against fixed offsets from the display base to identify which menu item was chosen.

Deletion Strategy

Records are not physically removed. Instead, deleting a record (line 1280) or dropping a member three months in arrears (line 2800) overwrites the entire 200-character row with inverse-Z characters (%Z, character code 90 in inverse video, i.e. byte value 218). The first character of a row is tested against "%Z" throughout the program to detect “empty” slots. After sorting, lines 1561–1565 recount valid records by scanning for non-%Z first characters and reset TOTALRECORDS and RECORDNBR accordingly.

Dues Arithmetic

The subroutine at lines 9040–9095 converts a payment amount into additional months using a tiered rate: amounts under 12 divide by 2.5, amounts 12 or over divide by 2. The result is added to the stored “paid-through month” field (A$(X,187 TO 188)). If the resulting month exceeds 12, it wraps around and the year field (A$(X,190 TO 191)) is incremented. Lines 2303–2370 compare stored year and month substrings against the entered current date to classify each member into one of four billing categories (paid ahead, current, one month late, two months late), with three-months-late members being auto-deleted.

Membership Listing Print Buffer

The membership listing routine (lines 2830–3500) allocates a temporary DIM C$(240,80) buffer at line 2890. It formats records two per line in three address-block rows into 80-column wide strings, then prints the listing in three vertical passes (columns 1–24, 25–56, 57–80) to accommodate a narrow printer, producing a two-column layout. The buffer is freed at line 3495 with DIM C$(1,1).

Sorting

A simple O(n²) bubble sort is used at lines 1490–1560. The user selects the field to sort on (by its index D), and the sort compares the relevant substring slice A$(X, A(D) TO B(D)) of each record pair. Because deleted records are filled with inverse-Z (high byte values), they sort to the end of the array naturally — a side-effect that aids compaction rather than being explicitly designed for it.

Bugs and Anomalies

  • Lines 2330–2370 use VAL A$(X, TO 2) and VAL C$(1, TO 2) with an omitted lower bound — this is valid ZX81/TS1000 syntax meaning from position 1, but the mix with the substring comparisons at 2303–2312 creates potential double-triggering for some records.
  • Lines 930–935 use IF I$="N" THEN NEXT X followed immediately by IF I$="N" THEN GOTO 1080. After NEXT X exhausts the loop, execution falls to line 1080 anyway, making the second IF redundant; but if NEXT X continues the loop, line 935 is never reached for that iteration.
  • The billing letter at line 2660 misspells “RECEIVED” as “RECIVIED” twice, and line 2760 similarly spells it “RECIVIE”.
  • Line 9100 contains a stray SAVE "1019%0" (a developer save artefact) followed by LIST 5 at line 9110, both after the RETURN at line 9095, so they are unreachable in normal execution.
  • The FOR X=1 TO 30: NEXT X delay loops at lines 1071–1072 and 1288–1289 are busy-wait pauses with no real effect in SLOW mode where the display interrupt already provides pacing.

Content

Appears On

Assembled by Tim Ward from many sources. Contains programs 10176 – 10210.

Related Products

Related Articles

Related Content

Image Gallery

Dues Tracker (64k)

Source Code

   1 REM 6578AE7B00025DE7A3E8E021824071233DFE020F92A10407EFEC62832318F8237EFE152832318EF3E7233DFE020FA2284403A86402A84401C80FE0285ED4A3D18F72284403A87402A8440FE0284233D18F82284402AC401A60ED4A228240CDBB27CC62389444DCDBD7604E79328940106B78B120FB3A8940FE2320E3A8640FE282873A86403C3286403A8940FE2220E3A8640FE02873A86403D3286403A8740FE028E3A8940FE242073A87403D3287403A8740FEA828E3A8940FE212073A87403C3287403EA3288402A10407EFED92832318F8237EFECB2832318EF23232323233A8740FE0284233D18F8228A402AC401640ED4AED5B8A40E211A77D793D2313FE028218F32A8240ED5B8440E213A8840FEA2051AC6801811A77D793D2313FE028218E7233EA8133DFE020FA3A88403D328840FE0C2A8413A8940FE25287FE28283C39A40C91B1B1B1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1E1E1E
   5 FAST 
  10 DIM T$(200)
  20 DIM A$(50,200)
  30 LET T$="FIRST NAME/LAST NAME      /ADDRESS                         /CITY-STATE-ZIP CODE             /HOME PHONE NBR/WORK PHONE NBR/PROFESSION                      /COMP1/COMP2/COMP3/M-YJG/M-YDP/MYDPT/PC          "
  35 FOR X=1 TO 200
  40 LET A$(1,X)="%Z"
  45 NEXT X
  50 FOR X=2 TO 50
  55 LET A$(X)=A$(X-1)
  60 NEXT X
  70 LET MAXRECORDS=50
  80 LET TOTALRECORDS=0
  90 LET RECORDNBR=1
  95 DIM B$(14,32)
 100 DIM A(14)
 105 DIM B(14)
 110 DIM C(14)
 115 SLOW 
 120 FOR X=1 TO 14
 125 PRINT AT 12,0;"ENTER FIELD TITLE       (32 POS)"
 130 INPUT B$(X)
 135 PRINT AT 12,0;"ENTER STARTING POSITION OF FIELD"
 140 INPUT A(X)
 145 PRINT AT 12,0;"ENTER ENDING POSITION OF FIELD  "
 150 INPUT B(X)
 155 LET C(X)=B(X)-A(X)+1
 160 NEXT X
 170 REM VARI
 180 REM VARI
 190 REM VARI
 200 REM %M%E%N%U% % % % % % % % % % % % % % % % % % % 
 210 CLS 
 215 POKE 16418,0
 220 SLOW 
 230 PRINT AT 0,3;"TIMEX/SINCLAIR USERS GROUP"
 240 PRINT AT 1,8;"FORT WORTH TEXAS"
 250 PRINT AT 4,3;"<--ENTER A RECORD";AT 6,3;"<--CHANGE A RECORD";AT 8,3;"<--DELETE A RECORD";AT 10,3;"<--SORT THE RECORDS";AT 12,3;"<--VIEW THE RECORDS";AT 14,3;"<--PRINT MAILING LABELS";AT 16,3;"<--UPDATE MEMBERSHIP DUES";AT 18,3;"<--PRINT MEMBERSHIP LISTING";AT 20,3;"<--SPECIAL FILE MANIPULATION";AT 22,3;"<--SAVE ""SPREADSHEET64K"""
 260 LET CURSOR=PEEK 16396+256*PEEK 16397+135
 270 POKE CURSOR,0
 280 LET CURSOR=CURSOR-(66 AND INKEY$="7")+(66 AND INKEY$="6")
 290 IF CURSOR<PEEK 16396+256*PEEK 16397+135 OR CURSOR>PEEK 16396+256*PEEK 16397+729 THEN GOTO 260
 300 POKE CURSOR,128
 310 IF INKEY$<>"9" THEN GOTO 270
 320 POKE 16418,2
 330 IF CURSOR=PEEK 16396+256*PEEK 16397+135 THEN GOSUB 430
 340 IF CURSOR=PEEK 16396+256*PEEK 16397+201 THEN GOSUB 700
 350 IF CURSOR=PEEK 16396+256*PEEK 16397+267 THEN GOSUB 1150
 360 IF CURSOR=PEEK 16396+256*PEEK 16397+333 THEN GOSUB 1360
 370 IF CURSOR=PEEK 16396+256*PEEK 16397+399 THEN GOSUB 1660
 380 IF CURSOR=PEEK 16396+256*PEEK 16397+465 THEN GOSUB 1730
 390 IF CURSOR=PEEK 16396+256*PEEK 16397+531 THEN GOSUB 1860
 400 IF CURSOR=PEEK 16396+256*PEEK 16397+597 THEN GOSUB 2830
 410 IF CURSOR=PEEK 16396+256*PEEK 16397+663 THEN GOSUB 3510
 420 IF CURSOR=PEEK 16396+256*PEEK 16397+729 THEN GOTO 3700
 425 GOTO 200
 430 REM %E%N%T%E%R% %A% %R%E%C%O%R%D% % % % % % % % % 
 450 FOR X=1 TO 14
 460 DIM C$(1,C(X))
 470 CLS 
 480 PRINT AT 0,8;"%E%N%T%E%R% %A% %R%E%C%O%R%D"
 490 PRINT AT 2,0;"PLEASE ENTER..."
 500 PRINT AT 4,0;B$(X)
 510 INPUT C$(1)
 520 PRINT AT 6,0;C$(1)
 530 PRINT AT 8,0;"IS THIS CORRECT (Y OR N)"
 540 GOSUB 9000
 570 IF I$="N" THEN GOTO 460
 580 LET A$(RECORDNBR,A(X) TO B(X))=C$(1)
 590 NEXT X
 600 LET RECORDNBR=RECORDNBR+1
 605 LET TOTALRECORDS=TOTALRECORDS+1
 610 CLS 
 620 PRINT AT 12,0;"DO YOU WISH TO ADD MORE RECORDS?"
 630 PRINT AT 13,14;"Y OR N"
 640 GOSUB 9000
 660 IF I$="Y" THEN GOTO 450
 670 IF I$="N" THEN RETURN 
 700 REM %C%H%A%N%G%E% %A% %R%E%C%O%R%D% % % % % % % % 
 710 FOR I=1 TO RECORDNBR
 720 CLS 
 730 PRINT AT 0,8;"%C%H%A%N%G%E% %A% %R%E%C%O%R%D"
 740 PRINT AT 2,0;"DO YOU WISH TO CHANGE THIS RCD?"
 750 PRINT AT 3,11;"(Y OR N)",,,,,
 760 FOR X=1 TO 2
 770 PRINT B$(X)
 780 PRINT A$(I,A(X) TO B(X))
 790 NEXT X
 800 GOSUB 9000
 830 IF I$="N" THEN GOTO 1080
 840 FOR X=1 TO 14
 850 CLS 
 860 PRINT AT 0,8;"%C%H%A%N%G%E% %A% %R%E%C%O%R%D"
 870 PRINT AT 2,0;"CHANGE THIS FIELD? (Y OR N)"
 880 PRINT AT 4,0;B$(X)
 890 PRINT A$(I,A(X) TO B(X))
 900 GOSUB 9000
 930 IF I$="N" THEN NEXT X
 935 IF I$="N" THEN GOTO 1080
 940 DIM C$(1,C(X))
 950 CLS 
 960 PRINT AT 0,8;"%C%H%A%N%G%E% %A% %R%E%C%O%R%D"
 970 PRINT AT 2,0;"PLEASE ENTER..."
 980 PRINT AT 4,0;B$(X)
 990 INPUT C$(1)
 1000 PRINT AT 6,0;C$(1)
 1010 PRINT AT 8,0;"IS THIS CORRECT? (Y OR N)"
 1020 GOSUB 9000
 1050 IF I$="N" THEN GOTO 950
 1060 LET A$(I,A(X) TO B(X))=C$(1)
 1070 NEXT X
 1071 FOR X=1 TO 30
 1072 NEXT X
 1080 PRINT AT 18,0;"DO YOU WISH TO CHANGE MORE RCDS?"
 1090 PRINT AT 19,11;"(Y OR N)"
 1100 GOSUB 9000
 1130 IF I$="Y" THEN NEXT I
 1140 RETURN 
 1150 REM %D%E%L%E%T%E% %A% %R%E%C%O%R%D% % % % % % % % 
 1160 FOR I=1 TO RECORDNBR
 1170 CLS 
 1180 PRINT AT 0,8;"%D%E%L%E%T%E% %A% %R%E%C%O%R%D"
 1190 PRINT AT 2,0;"DO YOU WISH TO DELETE THIS RCD?"
 1200 PRINT AT 3,11;"(Y OR N)",,,,,
 1210 FOR X=1 TO 3
 1220 PRINT B$(X)
 1230 PRINT A$(I,A(X) TO B(X))
 1240 NEXT X
 1250 GOSUB 9000
 1280 IF I$="Y" THEN LET A$(I)="%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z"
 1285 IF I$="Y" THEN LET TOTALRECORDS=TOTALRECORDS-1
 1288 FOR X=1 TO 30
 1289 NEXT X
 1290 PRINT AT 18,0;"DO YOU WISH TO DELETE MORE RCDS?"
 1300 PRINT AT 19,11;"(Y OR N)"
 1310 GOSUB 9000
 1340 IF I$="Y" THEN NEXT I
 1350 RETURN 
 1360 REM %S%O%R%T% %T%H%E% %R%E%C%O%R%D%S% % % % % % % 
 1370 CLS 
 1380 FOR X=1 TO 14
 1390 PRINT AT 0,8;"%S%O%R%T% %T%H%E% %R%E%C%O%R%D%S"
 1400 PRINT AT 2,0;"DO YOU WISH TO SORT THIS FIELD?"
 1410 PRINT AT 3,11;"(Y OR N)"
 1420 PRINT AT 6,0;B$(X)
 1430 GOSUB 9000
 1460 IF I$="Y" THEN GOTO 1470
 1462 NEXT X
 1465 GOTO 1380
 1470 FAST 
 1480 LET D=X
 1490 FOR X=1 TO MAXRECORDS-1
 1500 FOR S=X+1 TO MAXRECORDS
 1510 IF A$(X,A(D) TO B(D))<A$(S,A(D) TO B(D)) THEN GOTO 1550
 1520 LET S$=A$(X)
 1530 LET A$(X)=A$(S)
 1540 LET A$(S)=S$
 1550 NEXT S
 1560 NEXT X
 1561 LET TOTALRECORDS=0
 1562 FOR X=1 TO MAXRECORDS
 1563 IF A$(X,1)<>"%Z" THEN LET TOTALRECORDS=TOTALRECORDS+1
 1564 NEXT X
 1565 LET RECORDNBR=TOTALRECORDS+1
 1570 SLOW 
 1580 CLS 
 1590 PRINT AT 18,0;"DO YOU WISH TO SORT ANOTHER FLD?"
 1600 PRINT AT 19,11;"(Y OR N)"
 1610 GOSUB 9000
 1640 IF I$="Y" THEN GOTO 1360
 1650 GOTO 200
 1660 REM %V%I%E%W% %T%H%E% %R%E%C%O%R%D%S% % % % % % % 
 1670 CLS 
 1680 PRINT AT 0,0;"   TIMEX/SINCLAIR USERS GROUP   "
 1690 PRINT AT 1,9;"""SPREADSHEET"""
 1700 PRINT AT 16,0;"USE CURSOR KEYS TO MOVE THE     SPREADSHEET UP,DOWN,LEFT,RIGHT. PRESS ""9"" TO RETURN TO MENU."
 1710 RAND USR 16524
 1720 RETURN 
 1730 REM %P%R%I%N%T% %M%A%I%L%I%N%G% %L%A%B%E%L%S% % % 
 1740 FAST 
 1750 FOR X=1 TO RECORDNBR-1
 1760 IF A$(X,1)="%Z" THEN GOTO 1830
 1770 LPRINT "--------------------------------"
 1780 LPRINT 
 1790 LPRINT A$(X,1 TO 27),,,
 1800 LPRINT A$(X,28 TO 60)
 1810 LPRINT A$(X,61 TO 93)
 1830 NEXT X
 1840 SLOW 
 1850 RETURN 
 1860 REM %U%P%D%A%T%E% %M%E%M%B%E%R%S%H%I%P% %D%U%E%S% 
 1870 FOR X=1 TO RECORDNBR-1
 1880 CLS 
 1890 PRINT AT 0,6;"%U%P%D%A%T%E% %M%E%M%B%E%R%S%H%I%P% %D%U%E%S"         
 1900 PRINT AT 2,0;"DO YOU WISH TO UPDATE THIS RCD?"
 1910 PRINT AT 3,11;"(Y OR N)"
 1920 PRINT AT 5,0;"FIRST NAME LAST NAME"
 1930 PRINT AT 7,0;A$(X,1 TO 27)
 1940 GOSUB 9000
 1970 IF I$="N" THEN GOTO 2200
 1980 CLS 
 1990 PRINT AT 0,6;"%U%P%D%A%T%E% %M%E%M%B%E%R%S%H%I%P% %D%U%E%S"
 2000 PRINT AT 2,0;"PLEASE ENTER..."
 2010 PRINT AT 4,0;"MONTH-YEAR DUES PAID"
 2020 INPUT A$(X,181 TO 185)
 2030 PRINT AT 6,0;A$(X,181 TO 185)
 2040 PRINT AT 8,0;"IS THIS CORRECT? (Y OR N)"
 2050 GOSUB 9000
 2080 IF I$="N" THEN GOTO 1980
 2090 CLS 
 2100 PRINT AT 0,6;"%U%P%D%A%T%E% %M%E%M%B%E%R%S%H%I%P% %D%U%E%S"
 2110 PRINT AT 2,0;"PLEASE ENTER..."
 2120 PRINT AT 4,0;"AMOUNT PAID. ";
 2121 INPUT P
 2122 PRINT P
 2123 PRINT AT 6,0;"IS THIS CORRECT? (Y OR N)"
 2124 GOSUB 9000
 2125 IF I$="N" THEN GOTO 2090
 2126 GOSUB 9040
 2200 NEXT X
 2240 CLS 
 2250 PRINT AT 11,0;"DO YOU WISH TO PRINT BILLING    NOTES AT THIS TIME? (Y OR N)"
 2260 GOSUB 9000
 2270 IF I$="N" THEN RETURN 
 2280 CLS 
 2290 PRINT AT 11,0;"PLEASE ENTER THE CURRENT MONTH- YEAR FOR BILLING IE 07-84"
 2295 DIM C$(1,5)
 2300 INPUT C$(1)
 2301 FAST 
 2302 FOR X=1 TO RECORDNBR-1
 2303 IF A$(X,190 TO 191)>C$(1,4 TO 5) THEN GOTO 2400
 2310 IF A$(X,190 TO 191)<C$(1,4 TO 5) AND (VAL A$(X,187 TO 188)-12)-(VAL C$(1,1 TO 2))=-1 THEN GOTO 2600
 2311 IF A$(X,190 TO 191)<C$(1,4 TO 5) AND (VAL A$(X,187 TO 188)-12)-(VAL C$(1,1 TO 2))=-2 THEN GOTO 2700
 2312 IF A$(X,190 TO 191)<C$(1,4 TO 5) AND (VAL A$(X,187 TO 188)-12)-(VAL C$(1,1 TO 2))=-3 THEN GOTO 2800
 2330 IF (VAL A$(X,187 TO 188))-(VAL C$(1, TO 2))>0 THEN GOTO 2400
 2340 IF (VAL A$(X,187 TO 188))-(VAL C$(1, TO 2))=0 THEN GOTO 2500
 2350 IF (VAL A$(X,187 TO 188))-(VAL C$(1, TO 2))=-1 THEN GOTO 2600
 2360 IF (VAL A$(X,187 TO 188))-(VAL C$(1, TO 2))=-2 THEN GOTO 2700
 2370 IF (VAL A$(X,187 TO 188))-(VAL C$(1, TO 2))=-3 THEN GOTO 2800
 2380 NEXT X
 2390 RETURN 
 2400 LPRINT "--------------------------------"
 2410 LPRINT 
 2420 LPRINT TAB 27;C$(1)
 2430 LPRINT 
 2440 LPRINT "DEAR ";A$(X, TO 27)
 2450 LPRINT 
 2460 LPRINT "   JUST A SHORT NOTE TO SAY     THANK-YOU FOR PAYING YOUR DUES  IN ADVANCE MY RECORDS SHOW THAT YOUR DUES ARE PAID THRU ";A$(X,187 TO 192)
 2470 LPRINT "AGAIN ""THANK-YOU"" THE GROUP     NEEDS MORE MEMBERS LIKE YOU." 
 2480 LPRINT "SINCERELY",,,,,,"TIM L. WARD                     ACTING TREASURER",,,
 2490 GOTO 2380
 2500 LPRINT "--------------------------------"
 2510 LPRINT 
 2520 LPRINT TAB 27;C$(1)
 2530 LPRINT 
 2540 LPRINT "DEAR ";A$(X, TO 27)
 2550 LPRINT 
 2560 LPRINT "   JUST A SHORT NOTE TO SAY     THANK-YOU FOR PAYING YOUR DUES  ON TIME.  MY RECORDS SHOW THAT  YOUR DUES ARE PAID THRU ";A$(X,187 TO 192)
 2570 LPRINT "AGAIN ""THANK-YOU"" THE GROUP     NEEDS MORE MEMBERS LIKE YOU."
 2580 LPRINT "SINCERELY",,,,,,"TIM L. WARD                     ACTING TREASURER",,,
 2590 GOTO 2380
 2600 LPRINT "--------------------------------"
 2610 LPRINT 
 2620 LPRINT TAB 27;C$(1)
 2630 LPRINT 
 2640 LPRINT "DEAR ";A$(X, TO 27)
 2650 LPRINT 
 2660 LPRINT "   JUST A SHORT NOTE TO LET YOU KNOW THAT I HAVE NOT RECIVIED   YOUR DUES FOR THIS MONTH.  IF   YOU HAVE ALREADY PAID THEM      PLEASE DISREGARD THIS NOTE.  IF   YOU HAVE ANY QUESTIONS PLEASE   CALL ME."
 2670 LPRINT "RESPECTFULLY",,,,,,"TIM L. WARD                     ACTING TREASURER",,,
 2680 GOTO 2380
 2700 LPRINT "--------------------------------"
 2710 LPRINT 
 2720 LPRINT TAB 27;C$(1)
 2730 LPRINT 
 2740 LPRINT "DEAR ";A$(X, TO 27)
 2750 LPRINT 
 2760 LPRINT "   JUST A SHORT NOTE TO LET YOU KNOW THAT THIS IS THE LAST      NEWSLETTER YOU WILL RECIVIE     UNLESS I RECIVIE THE TWO MONTHS DUES YOU PRESENTLY OWE.  YOUR   NAME WILL BE DROPPED FROM THE   MEMBERSHIP UNLESS YOU PAY BY THENEXT MEETING.  IF YOU HAVE ANY  QUESTIONS PLEASE CALL ME."
 2770 LPRINT "RESPECTFULLY",,,,,,"TIM L. WARD                     ACTING TREASURER",,,
 2780 GOTO 2380
 2800 LET A$(X)="%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z"
 2810 LET TOTALRECORDS=TOTALRECORDS-1
 2820 GOTO 2380
 2830 REM %P%R%I%N%T% %M%E%M%B%E%R%S%H%I%P% %L%I%S%T% % 
 2840 CLS 
 2850 PRINT AT 0,5;"%P%R%I%N%T% %M%E%M%B%E%R%S%H%I%P% %L%I%S%T"
 2860 PRINT AT 10,0;"PLEASE ENTER DATE OF LISTING"
 2870 INPUT L$
 2880 FAST 
 2890 DIM C$(240,80)
 2900 LET PAGE=1
 2910 LET LINE=1
 2920 LET C$(LINE)=""
 2930 LET C$(LINE+1)=""
 2940 LET C$(LINE+2,28 TO 53)="TIMEX/SINCLAIR USERS GROUP"
 2950 LET C$(LINE+3,31 TO 50)="OF FORT WORTH, TEXAS"
 2960 LET C$(LINE+4)=""
 2970 LET C$(LINE+5,28 TO 53)="MEMBERSHIP AS OF "+L$
 2980 LET C$(LINE+6)=""
 2990 LET C$(LINE+7)=""
 3000 LET LINE=LINE+8
 3010 FOR X=PAGE TO PAGE+17 STEP 2
 3020 IF A$(X,1)="%Z" THEN GOTO 3370
 3030 LET C$(LINE,7 TO 38)=A$(X, TO 27)
 3040 LET C$(LINE,44 TO 75)=A$(X+1, TO 27)
 3050 IF A$(X+1,1)="%Z" THEN LET C$(LINE,44 TO 75)=""
 3060 LET LINE=LINE+1
 3070 LET C$(LINE,7 TO 38)=A$(X,28 TO 59)
 3080 LET C$(LINE,44 TO 75)=A$(X+1,28 TO 59)
 3090 IF A$(X+1,1)="%Z" THEN LET C$(LINE,44 TO 75)=""
 3100 LET LINE=LINE+1
 3110 LET C$(LINE,7 TO 38)=A$(X,61 TO 92)
 3120 LET C$(LINE,44 TO 75)=A$(X+1,61 TO 92)
 3130 IF A$(X+1,1)="%Z" THEN LET C$(LINE,44 TO 75)=""
 3140 LET LINE=LINE+1
 3150 LET C$(LINE,7 TO 38)="HOME PHONE NBR. "+A$(X,94 TO 107)
 3160 LET C$(LINE,44 TO 75)="HOME PHONE NBR. "+A$(X+1,94 TO 107)
 3170 IF A$(X+1,1)="%Z" THEN LET C$(LINE,44 TO 75)=""
 3180 LET LINE=LINE+1
 3190 LET C$(LINE,7 TO 38)="WORK PHONE NBR. "+A$(X,109 TO 122)
 3200 LET C$(LINE,44 TO 75)="WORK PHONE NBR. "+A$(X+1,109 TO 122)
 3210 IF A$(X+1,1)="%Z" THEN LET C$(LINE,44 TO 75)=""
 3220 LET LINE=LINE+1
 3230 LET C$(LINE,7 TO 38)=A$(X,124 TO 155)
 3240 LET C$(LINE,44 TO 75)=A$(X+1,124 TO 155)
 3250 IF A$(X+1,1)="%Z" THEN LET C$(LINE,44 TO 75)=""
 3260 LET LINE=LINE+1
 3270 LET C$(LINE,7 TO 38)="TYPE COMPUTERS "+A$(X,157 TO 161)+","+A$(X,163 TO 167)+","+A$(X,169 TO 173)
 3280 LET C$(LINE,44 TO 75)="TYPE COMPUTERS "+A$(X+1,157 TO 161)+","+A$(X+1,163 TO 167)+","+A$(X+1,169 TO 173)
 3290 IF A$(X+1,1)="%Z" THEN LET C$(LINE,44 TO 75)=""
 3300 LET LINE=LINE+2
 3310 NEXT X
 3320 LET LINE=LINE+1
 3330 LET C$(LINE)="--------------------------------------------------------------------------------"
 3340 LET LINE=LINE+1
 3350 LET PAGE=PAGE+18
 3360 GOTO 2920
 3370 FOR X=1 TO LINE
 3380 LPRINT "% % % % % % % ";C$(X, TO 24)
 3390 NEXT X
 3400 LPRINT "--------------------------------"
 3410 FOR X=1 TO LINE
 3420 LPRINT C$(X,25 TO 56)
 3430 NEXT X
 3440 LPRINT "--------------------------------"
 3450 FOR X=1 TO LINE
 3460 LPRINT C$(X,57 TO 80);"% % % % % % % "
 3470 NEXT X
 3480 LPRINT "--------------------------------"
 3490 SLOW 
 3495 DIM C$(1,1)
 3500 RETURN 
 3510 REM %F%I%L%E% %M%A%N%I%P%U%L%A%T%I%O%N% % % % % % 
 3520 FAST 
 3530 FOR X=1 TO RECORDNBR
 3540 LPRINT A$(X)
 3550 LPRINT 
 3560 LPRINT "--------------------------------"
 3570 LPRINT 
 3580 NEXT X
 3590 SLOW 
 3600 REM 
 3610 REM 
 3620 REM 
 3630 REM 
 3640 REM 
 3650 REM 
 3660 REM 
 3670 REM 
 3680 REM 
 3690 RETURN 
 3700 REM %S%A%V%E% %S%P%R%E%A%D%S%H%E%E%T%6%4%K% % % % 
 3705 CLS 
 3710 PRINT AT 10,0;"START TAPE RCORDER, PRESS ENTER."
 3720 INPUT I$
 3730 SAVE "SPREADSHEET64%K"
 3740 GOTO 200
 8999 STOP 
 9000 IF INKEY$="" THEN GOTO 9000
 9010 LET I$=INKEY$
 9020 IF I$<>"Y" AND I$<>"N" THEN GOTO 9000
 9030 RETURN 
 9040 IF P<12 THEN LET PD=P/2.5
 9045 IF P>=12 THEN LET PD=P/2
 9050 LET Q=INT (VAL A$(X,187 TO 188)+PD)
 9060 IF Q<13 THEN LET A$(X,187 TO 188)=STR$ Q
 9070 IF Q<13 THEN RETURN 
 9080 LET A$(X,187 TO 188)=STR$ (Q-12)
 9090 LET A$(X,190 TO 191)=STR$ (VAL A$(X,190 TO 191)+1)
 9095 RETURN 
 9100 SAVE "1019%0"
 9110 LIST 5

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

Scroll to Top