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 Range | Function |
|---|---|
| 1 | Machine code in REM (spreadsheet scroller) |
| 5–115 | Initialization: arrays, field definitions |
| 200–425 | Main menu with cursor-key navigation |
| 430–670 | Enter a record |
| 700–1140 | Change a record |
| 1150–1350 | Delete a record |
| 1360–1650 | Sort records |
| 1660–1720 | View records (calls machine code) |
| 1730–1850 | Print mailing labels |
| 1860–2820 | Update membership dues / print billing letters |
| 2830–3500 | Print membership listing |
| 3510–3690 | File manipulation (raw LPRINT dump) |
| 3700–3740 | SAVE to tape |
| 9000–9095 | Utility: 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:
| Columns | Field |
|---|---|
| 1–27 | First name / Last name |
| 28–60 | Address |
| 61–93 | City-State-Zip |
| 94–107 | Home phone |
| 109–122 | Work phone |
| 124–155 | Profession |
| 157–161, 163–167, 169–173 | Computer types (COMP1/2/3) |
| 175–180 | M-YJG |
| 181–186 | M-YDP (dues paid month-year) |
| 187–192 | MYDPT (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)andVAL 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 Xfollowed immediately byIF I$="N" THEN GOTO 1080. AfterNEXT Xexhausts the loop, execution falls to line 1080 anyway, making the second IF redundant; but ifNEXT Xcontinues 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 byLIST 5at line 9110, both after theRETURNat line 9095, so they are unreachable in normal execution. - The
FOR X=1 TO 30: NEXT Xdelay 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
Source Code
1 REM 6578AE7B 0 0 025DE7A3E 8 E 021824071233DFE 020F92A10407EFEC628 32318F8237EFE1528 32318EF3E 7233DFE 020FA2284403A86402A8440 1C8 0FE 028 5ED4A3D18F72284403A87402A8440FE 028 4233D18F82284402A C40 1A6 0ED4A228240CDBB 27CC6 238 9444DCDBD 7 6 04E79328940 1 0 6 B78B120FB3A8940FE2320 E3A8640FE2828 73A86403C3286403A8940FE2220 E3A8640FE 028 73A86403D3286403A8740FE 028 E3A8940FE2420 73A87403D3287403A8740FEA828 E3A8940FE2120 73A87403C3287403E A3288402A10407EFED928 32318F8237EFECB28 32318EF23232323233A8740FE 028 4233D18F8228A402A C40 164 0ED4AED5B8A40 E211A77 D793D2313FE 028 218F32A8240ED5B8440 E213A8840FE A20 51AC68018 11A77 D793D2313FE 028 218E7233EA8133DFE 020FA3A88403D328840FE 0C2A8413A8940FE2528 7FE2828 3C39A40C91B1B1B1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1E1E1E
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.
