--- title: "2068 BBS Program" type: "article" slug: "2068-bbs-program" url: "http://localhost/article/2068-bbs-program/" markdown_url: "http://localhost/article/2068-bbs-program.md" published_at: "2021-03-27T20:33:35+00:00" modified_at: "2026-06-27T09:16:17+00:00" featured_image: url: "http://localhost/wp-content/uploads/2022/04/20230809-041332.jpg" excerpt: "This program creates a limited capacity message BBS using a 2068 & 2050 modem. Thanks to Randy and Lucy Gordon for making BBS software available to us. This revised version has new features that will make it easier to use. I hacked the BASIC down some to make more room in memory for messages. I…" category: - name: "ZX-Appeal" slug: "zx-appeal" taxonomy: "category" url: "http://localhost/category/periodicals/zx-appeal/" post_tag: - name: "BBS" slug: "bbs" taxonomy: "post_tag" url: "http://localhost/tag/bbs/" - name: "Best of Timex/Sinclair 2068 Articles and Documents" slug: "ts2068best" taxonomy: "post_tag" url: "http://localhost/tag/ts2068best/" - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "Full Text" slug: "fulltext" taxonomy: "post_tag" url: "http://localhost/tag/fulltext/" - name: "TS 2050" slug: "ts-2050" taxonomy: "post_tag" url: "http://localhost/tag/ts-2050/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" - name: "Type-in program" slug: "type-in-program" taxonomy: "post_tag" url: "http://localhost/tag/type-in-program/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "Lucy Gordon" slug: "lucy-gordon" taxonomy: "indiv" url: "http://localhost/indiv/lucy-gordon/" - name: "Phillip Basford" slug: "phillip-basford" taxonomy: "indiv" url: "http://localhost/indiv/phillip-basford/" - name: "Randy Gordon" slug: "randy-gordon" taxonomy: "indiv" url: "http://localhost/indiv/randy-gordon/" publication: "ZX-Appeal" publication_r: id: 36087 title: "ZX-Appeal" type: "periodical" url: "http://localhost/periodical/zx-appeal/" authors: "Randy Gordon; Lucy Gordon; Phillip Basford" authors_r: - name: "Randy Gordon" slug: "randy-gordon" taxonomy: "indiv" url: "http://localhost/indiv/randy-gordon/" - name: "Lucy Gordon" slug: "lucy-gordon" taxonomy: "indiv" url: "http://localhost/indiv/lucy-gordon/" - name: "Phillip Basford" slug: "phillip-basford" taxonomy: "indiv" url: "http://localhost/indiv/phillip-basford/" issues_articles: - id: 36096 title: "ZX-Appeal July/August 1986" type: "issue" url: "http://localhost/issue/zx-appeal-july-august-1986/" pages: "32-33" pubdate: "July/August 1986" archive_link: false volumeissue: "vn" article_media: - id: 59981 title: "2068 BBS Program" type: "computer_media" url: "http://localhost/computer_media/2068-bbs-program/" --- # 2068 BBS Program This program creates a limited capacity message BBS using a 2068 & 2050 modem. Thanks to Randy and Lucy Gordon for making BBS software available to us. This revised version has new features that will make it easier to use. I hacked the BASIC down some to make more room in memory for messages. I left over 5000 bytes free so that you can customize the bulletins and prompt strings. To save the message base, you will have to BREAK the program and GOTO 9950. Any new versions will be sold by me for $5.00. I can only send listings for that price. ``` 10 PAPER 0: INK 7: BORDER 1: CLS 12 PRINT "stop tape"'''"then press (ENTER)": PAUSE 0: CLEAR 65478 14 LET l$="175219119230003079006000201219119230128200175219119230002040244219116050199255079219119230128200175219119230001040244121211115201219119230128200175219119230001040240201" 16 FOR x=0 TO 55: POKE 65480+x,VAL l$(3*x+1 to 3*x+3): NEXT x 18 LET o=VAL"65523": LET i=val "65489": LET l=val "9100": LET aa=val "1000": LET q=val "9200": 20 DIM m$(90,300): DIM y(1): PRINT "load?": PAUSE 0: IF INKEY$<>"y" THEN GO TO 24 22 LOAD "" DATA m$(): LOAD "" DATA y(): LET y1=y(1) 23 GO TO 25 24 LET y=10 1000 OUT 119,34: OUT 119,0 1001 POKE 23692,255: CLS: PRINT """2068 BBS""" 1002 LET x=IN 119 1004 IF x=5 THEN GO TO VAL "1002" 1010 OUT 119,2: OUT 119,34: PAUSE 300: OUT 119,64: OUT 119,123: OUT 119,55 1012 POKE 23674,0: POKE 23673,0: POKE 23672,0 1014 PAUSE 120 1016 FOR x=1 TO 30: RANDOMIZE USR o: OUT 115,0: NEXT X 1018 LET a=IN 119: IF a<128 THEN GO TO 1020 1020 RANDOMIZE USR o: OUT 115,28: RANDOMIZE USR o: OUT 115,31: RANDOMIZE USR o: OUT 115,28 1021 LET x=IN 115 1022 GO SUB VAL "8002" 1024 GO SUB 9400 1026 GO SUB 9405 1028 IF CODE l$(LEN l$)<>13 THEN GO TO 1026 1030 CLS: PRINT l$; " calling": LET u$=l$ 1032 GO SUB 8006 1034 GO SUB 9400 1038 IF l$="R" THEN GO TO 2100 1040 IF l$="F" THEN GO TO 2200 1042 IF l$="L" THEN GO TO 2300 1044 IF l$="B" THEN GO TO 9200 1046 IF l$="#" THEN GO TO 2400 1048 IF l$="C" THEN GO TO 2500 1090 GO TO 1032 2100 REM Reverse Read 2104 FOR b=y1 TO 1 STEP -1 2105 GO SUB 8018 2106 GO SUB 9500 2114 IF l$="N" THEN NEXT b 2116 IF l$="M" THEN GO TO 1032 2118 GO TO 1032 2200 REM Forward Read 2204 FOR b=1 to y1 2205 GO SUB 8018 2206 GO SUB 9500 2214 IF l$="N" THEN NEXT b 2216 IF l$="M" THEN GO TO 1032 2218 GO TO 1032 2300 REM Leave Message 2302 LET y1=y1+1: IF y1=90 THEN LET y1=1 2304 GO SUB 8010 2306 GO SUB 9400 2308 GO SUB 9405 2310 IF in<>13 THEN GO TO 2308 2312 LET l$="TO: "+l$+CHR$ 13+"FROM: "+u$+CHR$ 13: LET y2=LEN l$: LET m$(y1, TO y2)=l$ 2314 GO SUB 8012 2316 GO SUB 9400 2318 GO SUB 9402 2320 IF in<>13 THEN GO TO 2318 2322 REM Wordwrap 2330 IF LEN l$>299-y2+1 THEN LET l$=l$( TO 299-y2) 2332 LET c1=33 2334 IF l$(c1)<>" " THEN LET c1=c1-1 2336 IF l$(c1)=" " THEN LET l$(c1)=CHR$ 13 2338 IF CODE l$(c1)<>13 THEN GO TO 2334 2340 LET m$(y1,y2+1 TO y2+c1)=l$( TO C1): LET y2=ys+c1 2342 LET l$=l$(c1+1 TO ) 2344 IF LEN l$>32 THEN GO TO 2332 2345 LET l$=l$+CHR$ 7 2346 LET m$(y1,y2+1 TO 300)=l$ 2350 GO TO 1032 2400 REM Read by Number 2401 GO SUB VAL "8016" 2402 GO SUB 9400 2404 GO SUB 9405 2406 IF in<>13 THEN GO TO 2404 2408 LET b=VAL l$( TO (LEN l$-1)) 2410 GO SUB 8018 2412 GO SUB 9500 2414 IF l$="N" THEN GO TO VAL "2400" 2416 IF l$="M" THEN GO TO VAL "1032" 2418 GO TO 1032 2500 REM Chat Mode 2502 GO SUB 8020 2504 FOR x=1 TO 128 2506 BEEP .1,10+INT (x/10) 2508 RANDOMIZE USR o 2510 OUT 115,46 2512 IF INKEY$<>"" THEN GO TO 2550 2514 NEXT x 2516 GO SUB 8022: GO TO 1032 2550 CLS: PRINT "chat w/";u$ 2552 GO SUB 8024 2554 PRINT "NOT to escape" 2556 IF CODE INKEY$=195 THEN GO TO 1032 2558 POKE 23692,255 2560 LET r=0: LET xmit=0 2562 LET a=USR 65480 2564 LET xmit=1 and (a=1 or a=3) 2565 LET r=1 and (a=2 or a=3) 2569 IF r then GO TO 2576 2572 GO TO 2588 2576 RANDOMIZE USR i: LET in=PEEK 65479: IF in>32 or in<123 THEN PRINT CHR$ in;: IF in=13 THEN PRINT ">": GO TO 2556 2588 IF xmit and INKEY$<>"" THEN GO SUB 2592 2590 GO TO 2556 2592 IF xmit THEN LET l$=INKEY$: PRINT l$;: OUT 115,CODE l$: FOR x=1 TO 5: NEXT x: IF CODE l$=13 THEN PRINT ">"; 2596 RETURN 8000 REM Strings Going Out 8002 LET p$=CHR$ 12+"TIMEX BOARD"+CHR$ 13+"TURN YOUR CR SUPPRESSOR OFF"+CHR$ 13+CHR$ 13+"YOUR NAME?"+CHR$ 13+">"+CHR$ 7: GO SUB l: RETURN 8006 GO SUB VAL "9900": LET p$=CHR$ VAL "12"+"(B)YE BYE"+CHR$ 13+"(L)EAVE MSG."+CHR$ 13+"(F)WD. READ"+CHR$ 13+"(R)EV. READ"+CHR$ 13+"(#) READ BY #"+CHR$ 13+"(C)HAT"+CHR$ 13+"TIME ON "+l$+CHR$ 13: GO SUB l: RETURN 8008 LET p$=CHR$ 12+" BYE-BYE": GO SUB l: RETURN 8010 LET p$=CHR$ VAL "12"+"WHO GETS MESSAGE?"+CHR$ 13: GO SUB l: RETURN 8012 LET p$=CHR$ 12+"250 CHARACTERS MAX"+CHR$ 13+"(ENTER) SAVES MESSAGE"+CHR$ 13: GO SUB l: RETURN 8014 LET p$=CHR$ 13+"(N)EXT MESSAGE OR (M)ENU"+CHR$ 13: GO SUB l: RETURN 8016 LET p$=CHR$ 13+"INPUT MESSAGE # "CHR$ 13+"[1-90] ->": GO SUB l: RETURN 8018 LET p$=CHR$ 13+"MESSAGE # "+STR$ B+CHR$ 13: GO SUB l: RETURN 8020 LET p$=CHR$ 12+"PAGING SYSOP.....": GO SUB l: RETURN 8022 LET p$="HE'S NOT HERE!": GO SUB l: RETURN 8024 LET p$="OK, LET'S TALK...": GO SUB l: RETURN 9000 CLEAR: SAVE "BBS" LINE 10: STOP 9100 FOR x=1 TO LEN P$: RANDOMIZE USR o: OUT 115,CODE p$(x): NEXT x: POKE 23692,255: PRINT p$: RETURN 9201 GO SUB 8008: ON ERR RESET: RANDOMIZE USR o: OUT 115,28: RANDOMIZE USR o: OUT 115,31: GO SUB l: OUT 119,64: OUT 119,0: OUT 119,0 9202 BEEP .2,10: BEEP .3,-20 9204 GO TO aa 9400 LET l$="" 9406 ON ERR GO TO q: RANDOMIZE USR i: LET in=PEEK 65479 9407 IF in=13 THEN GO TO 9409 9408 IF IN<32 or in>122 THEN GO TO 9406 9409 POKE 23692,255: PRINT CHR$ in; 9410 LET ca=in: IF in>96 AND in<123 THEN LET ca=in-32: LET in=ca 9412 LET l$=l$+CHR$ in 9414 RETURN 9500 LET l$=m$(b) 9504 FOR a=300 to 1 step -1: IF CODE l$(a)<>7 THEN NEXT a 9506 LET p$=( TO a) 9510 GO SUB l: GO SUB 8014: GO SUB 9400: RETURN 9900 LET l$="": LET t=PEEK 23672+2^8*PEEK 23673+2^16*PEEK 23674: LET m=INT (t/3600): LET s=INT ((t/3600-m)*60): LET l$=STR$ m+":"+("0" and s<10)+STR$ s: RETURN 9950 SAVE "Msgs" DATA m$(): LET y(1)=y1: BEEP .1,50: SAVE "count" DATA y(): STOP ``` ## Source Code: 2068 BBS Program ``` 10 PAPER 0: INK 7: BORDER 1: CLS 12 PRINT "stop tape"'''"then press (ENTER)": PAUSE 0: CLEAR 65478 14 LET l$="175219119230003079006000201219119230128200175219119230002040244219116050199255079219119230128200175219119230001040244121211115201219119230128200175219119230001040240201" 16 FOR x=0 TO 55: POKE 65480+x,VAL l$(3*x+1 to 3*x+3): NEXT x 18 LET o=VAL"65523": LET i=val "65489": LET l=val "9100": LET aa=val "1000": LET q=val "9200": 20 DIM m$(90,300): DIM y(1): PRINT "load?": PAUSE 0: IF INKEY$<>"y" THEN GO TO 24 22 LOAD "" DATA m$(): LOAD "" DATA y(): LET y1=y(1) 23 GO TO 25 24 LET y=10 1000 OUT 119,34: OUT 119,0 1001 POKE 23692,255: CLS: PRINT """2068 BBS""" 1002 LET x=IN 119 1004 IF x=5 THEN GO TO VAL "1002" 1010 OUT 119,2: OUT 119,34: PAUSE 300: OUT 119,64: OUT 119,123: OUT 119,55 1012 POKE 23674,0: POKE 23673,0: POKE 23672,0 1014 PAUSE 120 1016 FOR x=1 TO 30: RANDOMIZE USR o: OUT 115,0: NEXT X 1018 LET a=IN 119: IF a<128 THEN GO TO 1020 1020 RANDOMIZE USR o: OUT 115,28: RANDOMIZE USR o: OUT 115,31: RANDOMIZE USR o: OUT 115,28 1021 LET x=IN 115 1022 GO SUB VAL "8002" 1024 GO SUB 9400 1026 GO SUB 9405 1028 IF CODE l$(LEN l$)<>13 THEN GO TO 1026 1030 CLS: PRINT l$; " calling": LET u$=l$ 1032 GO SUB 8006 1034 GO SUB 9400 1038 IF l$="R" THEN GO TO 2100 1040 IF l$="F" THEN GO TO 2200 1042 IF l$="L" THEN GO TO 2300 1044 IF l$="B" THEN GO TO 9200 1046 IF l$="#" THEN GO TO 2400 1048 IF l$="C" THEN GO TO 2500 1090 GO TO 1032 2100 REM Reverse Read 2104 FOR b=y1 TO 1 STEP -1 2105 GO SUB 8018 2106 GO SUB 9500 2114 IF l$="N" THEN NEXT b 2116 IF l$="M" THEN GO TO 1032 2118 GO TO 1032 2200 REM Forward Read 2204 FOR b=1 to y1 2205 GO SUB 8018 2206 GO SUB 9500 2214 IF l$="N" THEN NEXT b 2216 IF l$="M" THEN GO TO 1032 2218 GO TO 1032 2300 REM Leave Message 2302 LET y1=y1+1: IF y1=90 THEN LET y1=1 2304 GO SUB 8010 2306 GO SUB 9400 2308 GO SUB 9405 2310 IF in<>13 THEN GO TO 2308 2312 LET l$="TO: "+l$+CHR$ 13+"FROM: "+u$+CHR$ 13: LET y2=LEN l$: LET m$(y1, TO y2)=l$ 2314 GO SUB 8012 2316 GO SUB 9400 2318 GO SUB 9402 2320 IF in<>13 THEN GO TO 2318 2322 REM Wordwrap 2330 IF LEN l$>299-y2+1 THEN LET l$=l$( TO 299-y2) 2332 LET c1=33 2334 IF l$(c1)<>" " THEN LET c1=c1-1 2336 IF l$(c1)=" " THEN LET l$(c1)=CHR$ 13 2338 IF CODE l$(c1)<>13 THEN GO TO 2334 2340 LET m$(y1,y2+1 TO y2+c1)=l$( TO C1): LET y2=ys+c1 2342 LET l$=l$(c1+1 TO ) 2344 IF LEN l$>32 THEN GO TO 2332 2345 LET l$=l$+CHR$ 7 2346 LET m$(y1,y2+1 TO 300)=l$ 2350 GO TO 1032 2400 REM Read by Number 2401 GO SUB VAL "8016" 2402 GO SUB 9400 2404 GO SUB 9405 2406 IF in<>13 THEN GO TO 2404 2408 LET b=VAL l$( TO (LEN l$-1)) 2410 GO SUB 8018 2412 GO SUB 9500 2414 IF l$="N" THEN GO TO VAL "2400" 2416 IF l$="M" THEN GO TO VAL "1032" 2418 GO TO 1032 2500 REM Chat Mode 2502 GO SUB 8020 2504 FOR x=1 TO 128 2506 BEEP .1,10+INT (x/10) 2508 RANDOMIZE USR o 2510 OUT 115,46 2512 IF INKEY$<>"" THEN GO TO 2550 2514 NEXT x 2516 GO SUB 8022: GO TO 1032 2550 CLS: PRINT "chat w/";u$ 2552 GO SUB 8024 2554 PRINT "NOT to escape" 2556 IF CODE INKEY$=195 THEN GO TO 1032 2558 POKE 23692,255 2560 LET r=0: LET xmit=0 2562 LET a=USR 65480 2564 LET xmit=1 and (a=1 or a=3) 2565 LET r=1 and (a=2 or a=3) 2569 IF r then GO TO 2576 2572 GO TO 2588 2576 RANDOMIZE USR i: LET in=PEEK 65479: IF in>32 or in<123 THEN PRINT CHR$ in;: IF in=13 THEN PRINT ">": GO TO 2556 2588 IF xmit and INKEY$<>"" THEN GO SUB 2592 2590 GO TO 2556 2592 IF xmit THEN LET l$=INKEY$: PRINT l$;: OUT 115,CODE l$: FOR x=1 TO 5: NEXT x: IF CODE l$=13 THEN PRINT ">"; 2596 RETURN 8000 REM Strings Going Out 8002 LET p$=CHR$ 12+"TIMEX BOARD"+CHR$ 13+"TURN YOUR CR SUPPRESSOR OFF"+CHR$ 13+CHR$ 13+"YOUR NAME?"+CHR$ 13+">"+CHR$ 7: GO SUB l: RETURN 8006 GO SUB VAL "9900": LET p$=CHR$ VAL "12"+"(B)YE BYE"+CHR$ 13+"(L)EAVE MSG."+CHR$ 13+"(F)WD. READ"+CHR$ 13+"(R)EV. READ"+CHR$ 13+"(#) READ BY #"+CHR$ 13+"(C)HAT"+CHR$ 13+"TIME ON "+l$+CHR$ 13: GO SUB l: RETURN 8008 LET p$=CHR$ 12+" BYE-BYE": GO SUB l: RETURN 8010 LET p$=CHR$ VAL "12"+"WHO GETS MESSAGE?"+CHR$ 13: GO SUB l: RETURN 8012 LET p$=CHR$ 12+"250 CHARACTERS MAX"+CHR$ 13+"(ENTER) SAVES MESSAGE"+CHR$ 13: GO SUB l: RETURN 8014 LET p$=CHR$ 13+"(N)EXT MESSAGE OR (M)ENU"+CHR$ 13: GO SUB l: RETURN 8016 LET p$=CHR$ 13+"INPUT MESSAGE # "CHR$ 13+"[1-90] ->": GO SUB l: RETURN 8018 LET p$=CHR$ 13+"MESSAGE # "+STR$ B+CHR$ 13: GO SUB l: RETURN 8020 LET p$=CHR$ 12+"PAGING SYSOP.....": GO SUB l: RETURN 8022 LET p$="HE'S NOT HERE!": GO SUB l: RETURN 8024 LET p$="OK, LET'S TALK...": GO SUB l: RETURN 9000 CLEAR: SAVE "BBS" LINE 10: STOP 9100 FOR x=1 TO LEN P$: RANDOMIZE USR o: OUT 115,CODE p$(x): NEXT x: POKE 23692,255: PRINT p$: RETURN 9201 GO SUB 8008: ON ERR RESET: RANDOMIZE USR o: OUT 115,28: RANDOMIZE USR o: OUT 115,31: GO SUB l: OUT 119,64: OUT 119,0: OUT 119,0 9202 BEEP .2,10: BEEP .3,-20 9204 GO TO aa 9400 LET l$="" 9406 ON ERR GO TO q: RANDOMIZE USR i: LET in=PEEK 65479 9407 IF in=13 THEN GO TO 9409 9408 IF IN<32 or in>122 THEN GO TO 9406 9409 POKE 23692,255: PRINT CHR$ in; 9410 LET ca=in: IF in>96 AND in<123 THEN LET ca=in-32: LET in=ca 9412 LET l$=l$+CHR$ in 9414 RETURN 9500 LET l$=m$(b) 9504 FOR a=300 to 1 step -1: IF CODE l$(a)<>7 THEN NEXT a 9506 LET p$=( TO a) 9510 GO SUB l: GO SUB 8014: GO SUB 9400: RETURN 9900 LET l$="": LET t=PEEK 23672+2^8*PEEK 23673+2^16*PEEK 23674: LET m=INT (t/3600): LET s=INT ((t/3600-m)*60): LET l$=STR$ m+":"+("0" and s<10)+STR$ s: RETURN 9950 SAVE "Msgs" DATA m$(): LET y(1)=y1: BEEP .1,50: SAVE "count" DATA y(): STOP ```