Willie Jones’ bulletin board system.
Source Code
10 CLS 20 PRINT AT 5,0;"Load BBSMC tape and press ""PLAY""" 30 LOAD "bbsmc"CODE 35 PRINT "Loaded...Enter Date" 37 INPUT "DATE: DD/MM ";d$ 40 PRINT ,,"PRESS ANY KEY TO GO ONLINE..." 50 PAUSE 0 1000 REM ANSWER PHONE 1002 OUT 119,34 1004 OUT 119,0 1006 PRINT AT 5,4;"SCANNING PHONE LINE..." 1010 PRINT AT 10,6;"PRESS ""S"" to update cassette" 1012 PRINT TAB 6;"PRESS ""C"" ANYTIME TO FORCE CALLER INTO CHAT MODE" 1020 LET a=IN 119 1025 IF INKEY$="S" OR INKEY$="s" THEN SAVE "tsbbs" LINE 10 1030 IF a=5 THEN GO TO 1020 1080 REM RING IN 1090 OUT 119,2: OUT 119,34 2000 REM WARM START 2001 OUT 119,64: OUT 119,123: OUT 119,55 2002 REM SET ONLINE TIMER 2003 POKE 23672,0: POKE 23673,0: POKE 23674,0 2004 GO SUB logonbull: GO SUB inname 2005 REM MAIN MENU 2006 GO SUB cls 2007 DATA " Willie's TS-BBS"," ","<R>ead your messages","<L>eave a message","<C>hat with SYSOP","<U>tilities Menu","<T>ime on since logon","<H>ang Up"," ","Choice?:" 2010 RESTORE 2007 2020 FOR p=1 TO 10: READ p$: GO SUB nl: GO SUB sm: NEXT p 2036 ON ERR GO TO quit: GO SUB getkey: LET c$=r$ 2037 IF c$="U" OR c$="u" THEN GO TO 6100 2040 IF c$="r" OR c$="R" THEN FOR x=1 TO 2: GO SUB nl: NEXT x: GO TO read 2041 IF c$="t" OR c$="T" THEN GO SUB timer: LET p$="Connect time HH/MM: ": LET p$=p$+x$: GO SUB nl: GO SUB sm: PAUSE 100: GO TO inputcom 2045 IF c$="c" OR c$="C" THEN GO TO chat 2047 IF c$="H" OR c$="h" THEN GO TO quit 2050 IF c$="l" OR c$="L" THEN GO TO leave 2070 GO TO inputcom 3000 REM read messages 3007 LET w(un)=0 3010 LET p$="Scanning message base.....": GO SUB sm 3020 FOR u=1 TO 50 3025 LET r$=m$(u,5 TO (LEN u$+4)): IF r$=u$ THEN GO TO 3070 3030 NEXT u 3040 REM DONE SCANNING MESSAGES 3045 GO SUB nl: GO SUB nl 3050 LET p$="message scan completed...": GO SUB sm: PAUSE 100: GO TO inputcom 3060 REM MESSAGE #X FOUND 3070 GO SUB cls: LET p$="Message #"+STR$ u: GO SUB sm: GO SUB nl 3080 LET p$=m$(u): GO SUB sm 3085 GO SUB nl: GO SUB nl: LET p$="N=Next One D=Delete Q=Quit: ": GO SUB sm 3090 GO SUB getkey: LET c$=r$ 3095 IF c$="N" OR c$="n" THEN GO SUB cls: GO TO 3030 3100 IF c$="D" OR c$="d" THEN FOR x=1 TO 400: LET m$(u,x)="": NEXT x: GO SUB nl: LET p$="*DELETED*": LET m(u)=0: GO SUB sm: PAUSE 100: GO SUB cls: RETURN 3105 IF c$="Q" OR c$="q" THEN GO TO inputcom 3110 GO TO 3090 4000 REM leave message 4010 LET y=1 4015 IF m(y)=0 THEN GO TO 4025 4020 LET y=y+1: GO TO 4015 4025 GO SUB cls 4030 LET p$="Message #"+STR$ y: GO SUB sm 4032 GO SUB nl: GO SUB nl 4035 LET p$="Who gets message?: ": GO SUB sm 4040 GO SUB getkey: LET a$=r$ 4042 LET i$="": LET k$="" 4045 FOR x=1 TO LEN a$ 4050 IF a$(x)<>" " THEN LET i$=i$+a$(x) 4055 IF a$(x)=" " THEN GO TO 4065 4060 NEXT x 4065 LET k$=a$(x+1 TO ) 4066 FOR x=1 TO tu: IF f$(x,1 TO LEN i$)=i$ AND l$(x,1 TO LEN k$)=k$ THEN GO TO 4070 4067 NEXT x 4070 LET w(x)=w(x)+1 4072 LET m$(y,1 TO 32)="To: "+a$ 4075 LET p$="From: "+u$: GO SUB sm: LET m$(y,33 TO 64)=p$ 4080 GO SUB nl 4085 LET p$="Input message (400 chars max)...<CTRL C> to save...": GO SUB sm: GO SUB nl 4090 LET wm=1: GO SUB getkey: LET wm=0: LET p$="*DONE*": GO SUB sm: LET m$(y,65 TO )=r$ 4095 LET m$(y,LEN r$+65)=CHR$ 3 4110 GO SUB nl: GO SUB nl 4120 LET p$="R=Redo S=Save A=Abort: (R,S,A)": GO SUB sm 4125 GO SUB getkey: LET c$=r$ 4130 IF c$="R" OR c$="r" THEN GO TO 4025 4135 IF c$="S" OR c$="s" THEN LET m(y)=1: LET p$="*STORED*": GO SUB sm: PAUSE 100: GO TO inputcom 4140 IF c$="A" OR c$="a" THEN GO TO inputcom 4145 GO TO 4125 5000 REM quit message base 5001 ON ERR RESET 5100 GO SUB nl 5110 LET p$="Thank you for calling!" 5115 GO SUB cls 5120 GO SUB sm 5125 OUT 119,64: OUT 119,0: OUT 119,0 5130 PAUSE 100: GO TO autoans 6000 REM LOGON MESSAGE 6001 PAUSE 30: FOR x=1 TO 30: RANDOMIZE USR output: OUT 115,0: NEXT x 6002 IF IN 119<128 THEN GO TO quit 6008 RANDOMIZE USR output: OUT 115,28 6010 GO SUB cls 6020 LET P$=" Willie's TS2068 BBS c/o Indiana Sinclair-Timex User Group": GO SUB sm 6030 FOR x=1 TO 5: GO SUB nl: NEXT x 6040 RETURN 6100 REM Utilities Sub-Menu 6102 GO SUB cls 6105 DATA " Utility Sub-Menu","<C>hange Personal UserFile","<L>ist of users","<R>eturn to Main Menu" 6110 RESTORE 6105 6115 FOR p=1 TO 4: READ p$: GO SUB sm: GO SUB nl: NEXT p 6117 GO SUB nl: GO SUB nl: LET p$="Choice? (C,L, or R): ": GO SUB sm 6120 GO SUB getkey 6125 IF r$="C" OR r$="c" THEN GO TO 6200 6130 IF r$="L" OR r$="l" THEN GO TO 6300 6135 IF r$="R" OR r$="r" THEN GO TO inputcom 6140 GO TO 6120 6199 REM CHANGE user file 6200 GO SUB cls 6205 LET p$="First Name: "+f$(un): GO SUB sm 6207 IF LEN f$(un)<20 THEN GO SUB nl 6210 LET p$="Last Name : "+l$(un): GO SUB sm 6213 IF LEN l$(un)<20 THEN GO SUB nl 6215 LET p$="PASSWORD : "+w$(un): GO SUB sm 6220 GO SUB nl 6225 LET p$="Change line? (1-3, 0=Exit): ": GO SUB sm: GO SUB getkey 6227 LET c$=r$ 6230 IF c$="0" THEN GO TO 6100 6235 IF c$="3" THEN LET p$="New Password: ": GO SUB sm: GO SUB getkey: IF LEN r$>8 THEN LET p$="Must be 1-8 characters!": GO SUB sm: GO TO 6235 6237 IF c$="3" THEN LET w$(un)=r$ 6240 IF c$="2" THEN LET p$="New Last Name: ": GO SUB sm: GO SUB getkey: LET l$(un)=r$ 6245 IF c$="1" THEN LET p$="New First Name: ": GO SUB sm: GO SUB getkey: LET f$(un)=r$ 6250 GO TO 6200 6300 REM transmit userfile list 6305 GO SUB cls 6310 LET p$="Press ENTER when ready:": GO SUB sm 6315 LET c=USR input 6316 IF c<>13 THEN GO TO 6315 6317 GO SUB nl 6320 FOR x=1 TO tu 6322 LET p$="User File #"+STR$ x 6323 GO SUB sm: GO SUB nl 6325 LET p$="Last name: "+l$(x): GO SUB sm 6327 IF LEN l$(x)<20 THEN GO SUB nl 6330 LET p$="First name: "+f$(x): GO SUB sm 6335 GO SUB nl: NEXT x 6340 GO SUB nl: LET p$="Press any key to go to main menu": GO SUB sm: LET c=USR input: GO TO inputcom 7000 REM chat 7001 ON ERR GO TO quit 7005 GO SUB nl: LET p$="Paging sysop...................": FOR x=1 TO 10: BEEP .1,1: NEXT x: GO SUB sm: GO SUB nl 7006 FOR x=1 TO 128: IF INKEY$="" THEN LET p$=".": GO SUB sm: BEEP .1,10: NEXT x: LET p$="The sysop is not available.....": GO TO inputcom 7008 GO SUB nl: LET p$="You are now in chat mode:": GO SUB sm: GO SUB nl 7009 CLS : PRINT "You are in chat mode with ";u$: PRINT : PRINT "SYMBL SHIFT/NOT to escape..." 7015 POKE 23692,255 7020 LET RxRDY=0: LET TxRDY=0 7100 LET a=USR statchk: LET TxRDY=1 AND (a=1 OR a=3): LET RxRDY=1 AND (a=2 OR a=3) 7130 IF RxRDY THEN LET k=USR input: PRINT CHR$ k;: IF k=13 THEN PRINT ">"; 7135 IF RxRDY THEN IF k=3 THEN GO TO inputcom 7140 IF TxRDY AND INKEY$<>"" THEN GO SUB 7160 7150 GO TO 7010 7160 IF TxRDY THEN LET i$=INKEY$: PRINT i$;: IF CODE i$<>12 THEN OUT 115,CODE i$: IF CODE i$=13 THEN PRINT ">"; 7161 IF CODE i$=195 THEN GO TO inputcom 7162 IF INKEY$<>"" THEN GO TO 7162 7163 RETURN 7200 FOR d=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(d): PRINT p$(d); 7202 IF CODE p$(d)=3 THEN GO TO 7210 7205 NEXT d 7210 RETURN 7220 REM Send a CHR$ 13 7230 POKE 23692,255: PRINT : RANDOMIZE USR output: OUT 115,13: RETURN 7235 REM input subroutine 7237 LET r$="" 7240 LET c=USR input 7241 IF c=3 AND wm=1 THEN RETURN 7242 IF c=13 AND wm=1 THEN LET r$=r$+CHR$ 13: GO TO 7240 7245 IF c=13 THEN LET wm=0: RETURN 7250 IF c=8 THEN LET r$=r$( TO (LEN r$-(LEN r$>0))): GO TO 7240 7255 IF c<>13 AND c<>8 AND (c<32 OR c>122) THEN GO TO 7240 7260 LET r$=r$+CHR$ c: PRINT CHR$ c; 7265 GO TO 7240 7400 CLS : RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31: RETURN 8000 REM user input subroutine 8010 LET p$="First Name: ": GO SUB sm 8020 GO SUB getkey: LET a$=r$ 8050 LET p$="Last Name : ": GO SUB sm 8060 GO SUB getkey: LET b$=r$ 8065 GO SUB nl: LET p$="Above correct? (Y/N): ": GO SUB sm: GO SUB getkey: IF r$="n" OR r$="N" THEN GO TO 8000 8075 LET u$=a$+" "+b$ 8080 FOR x=1 TO tu 8085 IF l$(x,1 TO LEN b$)=b$ AND f$(x,1 TO LEN a$)=a$ THEN GO TO 8300 8090 NEXT x 8120 LET p$="You are a new user....": GO SUB sm 8125 REM new user 8127 LET tu=tu+1: IF tu>50 THEN LET tu=tu-1: LET p$="Sorry! Total number of users allowed access to this system has been reached. Please call back in a few days, by then a new spot should be open: THANKS!" 8128 GO SUB sm: PAUSE 300: GO TO quit 8130 GO SUB cls 8132 LET un=x 8135 LET p$=" WELCOME!": GO SUB sm: GO SUB nl: GO SUB nl 8140 GO SUB nl: GO SUB nl 8145 LET p$="I do hope you enjoy your visit with my BBS and please feel freeto leave any comments you wish addressed to SYSOP": GO SUB sm 8150 GO SUB nl: GO SUB nl 8155 LET p$="Please enter a 1-8 character password for further protection of your private mail-": GO SUB sm 8160 GO SUB nl 8165 GO SUB nl: LET p$="PASSWORD: ": GO SUB sm 8170 GO SUB getkey: LET c$=r$: IF LEN c$>8 THEN LET p$="Must be 1-8 characters ONLY!": GO SUB sm: GO TO 8165 8175 LET p$="Your password is "+c$: GO SUB sm: LET w$(un)=c$ 8180 GO SUB nl: LET p$="Change password? (Y/N):": GO SUB sm 8185 GO SUB getkey 8190 IF r$="Y" OR r$="y" THEN GO TO 8160 8195 LET l$(un)=b$: LET f$(un)=a$ 8200 LET z$(un)=d$ 8205 LET t(un)=1 8250 PAUSE 150: GO TO inputcom 8300 REM old user 8305 GO SUB nl 8310 LET un=x 8315 LET p$="PASSWORD : ": GO SUB sm 8320 GO SUB getkey 8407 GO SUB nl 8410 IF r$<>w$(un,1 TO LEN r$) THEN LET p$="Incorrect password -- Try again": GO SUB sm: GO TO 8300 8415 LET p$="You have called this system "+STR$ t(un): GO SUB sm: GO SUB nl: LET p$="times before.": GO SUB sm 8417 GO SUB nl 8420 LET p$="Last time called was on "+z$(un): GO SUB sm 8425 IF w(un)>0 THEN LET p$="You have "+STR$ w(un)+" messages waiting.": GO SUB sm 8430 LET z$(un)=d$ 8435 LET t(un)=t(un)+1 8440 PAUSE 200: GO TO inputcom 9990 REM timer 9992 DIM x$(5): LET time=INT ((PEEK 23672+256*PEEK 23673+256*256*PEEK 23674)/60): LET hr=INT (time/60/60): LET min=INT ((time-(hr*60*60))/60): PRINT AT 20,0;"0" AND hr<10;hr;":";"0" AND min<10;min: FOR x=1 TO 5: LET x$(x)=SCREEN$ (20,x-1): NEXT x 9993 RETURN