Bookworm

This program will help you manage your book, comic book, or phonograph record collection. Since my work involves daily interaction with a large mainframe computer, I have taken the attractive screen displays and shrunk them to size so they fit into the TS2068 screen format.

Enter the program as listed. In order to conserve memory and make the program execute faster, I have made extensive use of multiple statement lines. Note that all the statements on the same line after an IF get executed only if the conditional is true.

Once the program is in, enter CLEAR, and then LET f=9500. Now enter GOTO 6050. Start your tape recorder, then press ENTER. Bookworm will SAVE to tape. Once this completes, the variables will be assigned and the arrays will expand to full size. VERIFY each copy.

To use Bookworm, enter GOTO 1. Subsequent copies will be self-starting. If the program breaks for some reason, you can restart by entering GOTO 1. Never enter RUN, as this will destroy your data.

Bookworm stores approximately 425 titles as written in 48K RAM.

A ready to run verion of Bookworm is available on cassette with complete documentation for $10 from Magic World Software, POB 1184, Olympia WA 98507.

  10 REM *Bookworm* (c) Magic        World Software 1984
100 GO TO f
1000 REM SORT
1010 CLS : PRINT AT u,w;"HARD COPY DESIRED? (Y/N)": PAUSE w: IF INKEY$="y" OR INKEY$="Y" THEN LET p$=STR$ k
1300 LET s$="ALPHA LIST": LET b=w: LET n=a
1310 LET m=k
1320 LET b=m+k: IF b>n THEN GO TO 1360
1330 IF a$(b)>a$(m) THEN GO TO 1350
1340 LET m=m+k: GO TO 1320
1350 LET f$=a$(m): LET a$(m)=a$(b): LET a$(b)=f$: GO TO 1340
1360 LET c$=a$(n): GO SUB g: IF VAL p$<>k THEN PRINT AT z,w;" >Press ENTER to continue": PAUSE w
1370 LET n=n-k: IF n>w THEN GO TO 1310
1400 LET p$=STR$ w: GO TO e
1500 REM SEARCH
1520 CLS : PRINT AT u,w;"Enter Author or Title": INPUT d$: IF d$="" THEN GO TO c
1530 PRINT AT u,w;;" Now searching data .....": LET m=LEN d$-k: FOR n=k TO a: FOR b=k TO d-m
1550 IF d$=a$(n,b TO b+m) THEN GO TO 1590
1570 NEXT b: NEXT n
1580 PRINT AT u,w;" Unable to Locate Data": BEEP .05,k: IF VAL x$=3 OR VAL x$=4 THEN LET m=k
1585 RETURN
1590 LET c$=a$(n): GO SUB g: PRINT AT z,w;">Correct Title? (Y/N)": PAUSE w: IF INKEY$="y" OR INKEY$="Y" THEN RETURN
1600 CLS : PRINT AT u,w;" Continuing search .....": GO TO 1570
2000 REM ADD
2010 LET a=a+k: IF a>425 THEN CLS : PRINT AT u,w;">OUT OF MEMORY": BEEP .05,w: PRINT AT z,w;"Press ENTER for Menu": PAUSE w: GO TO f
2020 LET c$=b$: LET s$="ADD NEW TITLE": GO SUB g: LET c$( TO v)=d$: GO SUB g: LET c$(z TO d)=d$
2030 GO SUB g: LET c$(o TO 36)=d$: GO SUB g: LET c$(37 TO 45)=d$: GO SUB g: LET c$(46 TO 49)=d$: GO SUB g: LET c$(50 TO 51)=d$
2040 GO SUB g: LET c$(52 TO 55)=d$: GO SUB g: LET c$(56)=d$: GO SUB g: LET c$(57)=d$: GO SUB g: LET c$(58)=d$: GO SUB g: LET c$(59 TO 63)="0000"( TO 5-LEN d$)+d$
2050 GO SUB g: LET c$(64 TO 67)=d$: GO SUB g: LET c$(68 TO 69)=d$: GO SUB g: LET c$(70 TO )=d$
2100 GO SUB g: LET a$(a)=c$: GO TO e
3000 REM CHANGE
3020 LET s$="CHANGE DATA": LET m=w: GO SUB c: IF m=k THEN GO TO e
3030 PRINT AT z,w;"TITLE (or ""Enter"")": INPUT d$: IF d$<>"" THEN LET a$(n, TO v)=d$: GO SUB g
3050 PRINT AT z,w;">LAST NAME": INPUT d$: IF d$<>"" THEN LET a$(n,z TO d)=d$: GO SUB g
3070 PRINT AT z,w;">FIRST NAME": INPUT d$: IF d$<>"" THEN LET a$(n,o TO 36)=d$: GO SUB g
3090 PRINT AT z,w;">PUBLISHER ": INPUT d$: IF d$<>"" THEN LET a$(n,37 TO 45)=d$: GO SUB g
3110 PRINT AT z,w;">PUB. DATE": INPUT d$: IF d$<>"" THEN LET a$(n,46 TO 49)=d$: GO SUB g
3130 PRINT AT z,w;">EDITION ": INPUT d$: IF d$<>"" THEN LET a$(n,50 TO 51)=d$: GO SUB g
3150 PRINT AT z,w;">PAGES ": INPUT d$: IF d$<>"" THEN LET a$(n,52 TO 55)=d$: GO SUB g
3170 PRINT AT z,w;">SUBJECT": INPUT d$: IF d$<>"" THEN LET a$(n,56)=d$: GO SUB g
3190 PRINT AT z,w;">FORMAT ": INPUT d$: IF d$<>"" THEN LET a$(n,57)=d$: GO SUB g
3210 PRINT AT z,w;">CONDITION": INPUT d$: IF d$<>"" THEN LET a$(n,58)=d$: GO SUB g
3230 PRINT AT z,w;">VALUE ": INPUT d$: IF d$<>"" THEN LET a$(n,59 TO 63)="0000"( TO 5-LEN d$)+d$: GO SUB g
3250 PRINT AT z,w;">SOURCE": INPUT d$: IF d$<>"" THEN LET a$(n,64 TO 67)=d$: GO SUB g
3270 PRINT AT z,w;"># COPIES": INPUT d$: IF d$<>"" THEN LET a$(n,68 TO 69)=d$: GO SUB g
3290 PRINT AT z,w;">NOTES ": INPUT d$: IF d$<>"" THEN LET a$(n,70 TO )=d$
3300 GO SUB g: GO TO e
4000 REM DELETE
4010 LET s$="DELETE TITLE": LET m=w: GO SUB c: IF m=k THEN GO TO e
4030 PRINT AT z,w;">Enter ""D"" to Delete": PAUSE w: IF INKEY$<>"d" AND INKEY$<>"D" THEN GO TO e
4050 LET a$(n)="*Title Deleted*": LET a$(n,59 TO 63)="00000": LET a$(n,68 TO 69)="00": LET c$=a$(n): GO SUB g: BEEP .05,z: GO TO e
5000 REM RECALL
5010 LET s$="RECALL TITLE": GO SUB c: GO TO e
6000 REM SAVE
6050 SAVE "bookworm"
6060 GO TO f
7000 REM SUMMARY
7010 CLS : PRINT AT u,w;"HARD COPY OF SUMMARY? (Y/N)": PAUSE w: IF INKEY$="Y" OR INKEY$="y" THEN LET p$=STR$ k
7020 LET n=w: LET r=w: LET m=w: FOR b=k TO a
7060 LET r=r+VAL a$(b,68 TO 69): LET n=n+((VAL a$(b,62 TO 63)/100)+VAL a$(b,59 TO 61))*VAL a$(b,68 TO 69): IF VAL a$(b,68)=w THEN LET m=m+k
7100 NEXT b: CLS : PRINT AT k,w;"--> Action: Summary";AT 7,w;"No. of titles: ";a-m''"Total no. copies: ";r''"Total value: $";n''"No. titles in want list: ";m
7110 IF VAL p$=k THEN LPRINT "▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▌";TAB u;"*SUMMARY*";TAB o;"▐▌TITLES: ";a-m;TAB o;"▐▌COPIES: ";r;TAB o;"▐▌VALUE: $";n;TAB o;"▐▌WANT LIST: ";m;TAB o;"▜▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟": LET p$=STR$ w
7990 GO TO e
8000 REM SUBROUTINES
8040 CLS : PRINT AT w,u;"Master Menu";TAB u;"------ ----"''"(1) Alpha Sort"''"(2) Add New Title"''"(3) Change Existing Data"''"(4) Delete Title"''"(5) Recall Title"''" (6) Save to Tape"''"(7) Summary"
8050 PRINT AT z,w;">Please Select Function": LET x$=INKEY$: IF CODE x$<49 OR CODE x$>55 THEN GO TO 8050
8060 IF a=0 AND VAL x$<>2 THEN PRINT AT 19,w;">Cannot complete function selected - data files empty": GO TO 8050
8080 CLS : GO TO VAL x$*1e3
8100 PRINT AT z,w;" >Any more? (Y,N,Z) ": PAUSE w: IF INKEY$<>"N" AND INKEY$<>"n" AND INKEY$<>"Y" AND INKEY$<>"y" AND INKEY$<>"z" AND INKEY$<>"Z" THEN GO TO e
8110 IF INKEY$="Y" OR INKEY$="y" THEN GO TO VAL x$*1e3
8120 IF INKEY$="z" OR INKEY$="Z" THEN LET p$=STR$ k: GO SUB g: LET p$=STR$ w: GO TO e
8130 GO TO f
9000 REM DISPLAY
9010 CLS : PRINT "--> Action: ";s$: IF VAL x$<>k AND VAL x$<>3 THEN PRINT AT z,w;">Please enter data"
9020 IF VAL x$=3 THEN LET c$=a$(n)
9050 PRINT AT 2,w;"TITLE: ";c$( TO v)''"AUTHOR: ";c$(z TO d);" ";c$(o TO 36)''"PUBLISHER: ";c$(37 TO 45)''"PUB. DATE: ";c$(46 TO 49);TAB 17;"EDITION: ";c$(50 TO 51)''"PAGES: ";c$(52 TO 55);TAB 15;"SUBJECT: ";c$(56)''"FORMAT: ";c$(57);TAB 13;"CONDITION: ";c$(58)''"VALUE: $";c$(59 TO 61);".";c$(62 TO 63),"SOURCE: ";c$(64 TO 67)''"# COPIES: ";c$(68 TO 69);TAB 14;"NOTES: ";c$(70 TO )
9070 IF VAL p$=k THEN LPRINT "▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▌TITLE: ";c$( TO v);TAB o;"▐▌AUTHOR: ";c$(z TO d);" ";c$(o TO 36);TAB o;"▐▌PUBLISHER: ";c$(37 TO 45);TAB o;"▐▌PUB. DATE: ";c$(46 TO 49);TAB 17;"EDITION: ";c$(50 TO 51);TAB o;"▐▌PAGES: ";c$(52 TO 55),"SUBJECT: ";c$(56);TAB o;"▐▌FORMAT: ";c$(57);TAB 14;"CONDITION: ";c$(58);TAB o;"▐▌VALUE: $";c$(59 TO 61);".";c$(62 TO 63);"SOURCE: ";c$(64 TO 67);TAB o;"▐▌# COPIES: ";c$(68 TO 69);TAB 14;"NOTES: ";c$(70 TO );TAB o;"▜▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟"
9110 IF VAL x$<>k THEN LET p$=STR$ w: IF VAL x$=2 AND c$(70)=" " THEN INPUT d$: IF d$="" THEN GO TO 9110
9400 RETURN
9490 STOP
9500 REM VARIABLES
9510 LET c=1500: LET d=30: LET o=31: LET s=77: LET u=10: LET v=20: LET w=0: LET p$=STR$ w
9520 LET e=8100: LET f=8e3: LET g=9e3: LET k=1: LET a=w: LET z=21
9530 DIM a$(425,s): DIM c$(s)
9540 LET b$="_____________________________________________________________________________": LET c$=b$: GO TO f
SYNTACTIC SUM: 62008, TS2068

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