Bulletin board system for the Timex/Sinclair 2068.
Content
Source Code
1 REM T/S Tinyboard by FLASHWARE \* 1986 Randy/Lucy Gordon Timex-SinclairUsers Group of Cincinnati, Oh.
10 GO TO 9000
1000 REM autoans
1001 OUT 119,34
1002 OUT 119,0
1010 REM ansloop
1015 LET a=IN 119
1016 IF CODE INKEY$=195 THEN GO TO edit
1020 IF a=5 THEN GO TO ansloop
1066 FOR x=1 TO 5: BEEP .1,40: NEXT x
1070 OUT 119,2
1080 OUT 119,34
1090 PAUSE 300
2000 REM warmstart
2001 FOR x=1 TO 3: BEEP .1,x: NEXT x: OUT 119,64: OUT 119,123: OUT 119,55: POKE 23674,0: POKE 23673,0: POKE 23672,0: REM set online timer
2002 REM menu
2003 PAUSE 120: CLS : GO SUB logonbull: LET x=IN 115: LET p$="Full name: ": FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: GO SUB inname: LPRINT u$
2004 LET y=0: REM set message number to read
2005 REM inputcom
2006 RESTORE 2007
2007 DATA "T/S TINYBOARD MAIN MENU","<R>ead messages","<L>eave message","<C>hat mode","<T>ime on","<G>oodbye"," ","Choice?:"
2008 RANDOMIZE USR output: OUT 115,13: PRINT
2020 FOR p=1 TO 8: PRINT : RANDOMIZE USR output: OUT 115,13: READ p$: FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
2035 NEXT p
2036 ON ERR GO TO quit: LET c$=CHR$ USR input: PRINT c$: PRINT
2040 IF c$="r" OR c$="R" THEN FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: NEXT x: GO TO read
2041 IF c$="t" OR c$="T" THEN GO SUB timer: LET p$="Connect time ": LET p$=p$+x$: RANDOMIZE USR output: OUT 115,13: PRINT : FOR x=1 TO LEN p$: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: GO TO 2006
2045 IF c$="c" OR c$="C" THEN GO TO chat
2047 IF c$="g" OR c$="G" THEN PAUSE 30: GO TO quit
2050 IF c$="l" OR c$="L" THEN GO TO leave
2070 GO TO inputcom
3000 REM read messages
3015 LET y=y+1: IF y>20 THEN LET y=1
3018 IF m$(y,1)=" " THEN GO TO read
3019 PRINT AT 21,0;" ": PRINT AT 21,0;y: LET c$=SCREEN$ (21,0): LET c$=c$+SCREEN$ (21,1): LET p$="MESSAGE NUMBER: "+c$: RANDOMIZE USR output: OUT 115,13: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: PRINT : RANDOMIZE USR output: OUT 115,13
3024 FOR v=1 TO 1000: POKE 23692,255
3025 IF CODE m$(y,v)=3 THEN LET v=1000: NEXT v: GO TO inputcom
3030 PRINT m$(y,v);: RANDOMIZE USR output: OUT 115,CODE m$(y,v)
3031 IF v>64 THEN NEXT v
3032 IF (v>32 AND CODE m$(y,v)=13) THEN LET v=64: RANDOMIZE USR output: OUT 115,13
3033 IF (v<32 AND CODE m$(y,v)=13) THEN LET v=32
3035 NEXT v
3036 RANDOMIZE USR output: OUT 115,13: PRINT
3040 GO TO inputcom
4000 REM leave message
4010 LET y1=y1+1: IF y1>20 THEN LET y1=1
4011 DIM l$(1000): LET m$(y1)=l$
4012 RANDOMIZE USR output: OUT 115,13: LET p$="Who gets message?: ": FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: ON ERR GO TO quit: LET m$(y1,1 TO 4)="TO: ": FOR x=5 TO 32: LET m$(y1,x)=CHR$ USR input: PRINT m$(y1,x);
4013 IF CODE m$(y1,x)=13 THEN LET x=32
4014 NEXT x
4015 LET m$(y1,33 TO 38)="FROM: ": LET m$(y1,39 TO 64)=u$
4018 RANDOMIZE USR output: OUT 115,13: PRINT : LET p$="Input message (900 chars max)..<CTRL C> to save...": PRINT : RANDOMIZE USR output: OUT 115,13
4019 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: PRINT : NEXT x
4020 ON ERR GO TO quit: FOR v=65 TO 1000: POKE 23692,255: LET m1=USR input: REM ctrl C=03h=ETX
4050 LET m$(y1,v)=CHR$ m1: PRINT m$(y1,v);: IF m1=3 THEN LET v=1000: NEXT v: GO TO inputcom
4055 NEXT v
4070 GO TO inputcom
5000 REM quit message base
5001 ON ERR RESET
5100 RANDOMIZE USR output: OUT 115,13
5105 CLS : PAUSE 10
5110 LET p$="Thank you for calling the T/S TINYBOARD.... Hang up now!!!"
5115 PAUSE 30: CLS : RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
5120 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x
5121 PAUSE 120
5125 OUT 119,64: OUT 119,0: OUT 119,0
5130 PAUSE 60: CLS : FOR x=60 TO 1 STEP -5: BEEP .1,x: NEXT x: GO TO autoans
6000 REM logonbull
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
6005 RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
6008 RANDOMIZE USR 65200: OUT 115,28
6010 FOR x=1 TO 10: RANDOMIZE USR 65200: OUT 115,13: PRINT : NEXT x
6020 FOR x=1 TO LEN t$: POKE 23692,255: PRINT t$(x);: RANDOMIZE USR 65200: OUT 115,CODE t$(x): NEXT x
6030 FOR x=1 TO 5: RANDOMIZE USR 65200: OUT 115,13: PRINT : NEXT x
6040 RETURN
7000 REM chat
7001 ON ERR GO TO quit
7005 PRINT : RANDOMIZE USR 65200: OUT 115,13: LET p$="Paging sysop...................": FOR x=1 TO 10: BEEP .1,1: NEXT x: FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR 65200: OUT 115,CODE p$(x): NEXT x: PRINT : RANDOMIZE USR 65200: OUT 115,13
7006 FOR x=1 TO 128: IF INKEY$="" THEN PRINT ".";: RANDOMIZE USR 65200: OUT 115,46: BEEP .1,10: NEXT x: LET p$="The sysop is not available.....": FOR x=1 TO 10: BEEP .1,1: NEXT x: FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR 65200: OUT 115,CODE p$(x): NEXT x: PRINT : RANDOMIZE USR 65200: OUT 115,13: GO TO inputcom
7008 RANDOMIZE USR 65200: OUT 115,13: LET p$="You are now in chat mode:": FOR x=1 TO 10: BEEP .1,1: NEXT x: FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR 65200: OUT 115,CODE p$(x): NEXT x: PRINT : RANDOMIZE USR 65200: OUT 115,13
7009 CLS : PRINT "You are in chat mode with ";u$: PRINT : PRINT "SYMBL SHIFT/NOT to escape..."
7010 IF CODE INKEY$=195 THEN GO TO inputcom: REM 195=NOT
7011 POKE 23692,255
7020 LET RxRDY=0: LET TxRDY=0
7100 LET a=USR 65000: 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 65100: PRINT CHR$ k;: IF k=13 THEN PRINT ">";
7140 IF TxRDY AND INKEY$<>"" THEN GO SUB 7160
7150 GO TO 7010
7160 IF TxRDY THEN LET i$=INKEY$: PRINT i$;: OUT 115,CODE i$: FOR x=1 TO 5: NEXT x: IF CODE i$=13 THEN PRINT ">";
7161 IF INKEY$<>"" THEN GO TO 7161
7162 RETURN
8000 REM inname
8001 DIM u$(32): LET u=1
8002 RANDOMIZE USR output: OUT 115,5
8005 ON ERR GO TO quit: LET v$=CHR$ USR input: PRINT v$;
8010 LET u$(u)=v$ AND u<32: LET u=u+1
8011 IF CODE v$=13 THEN RETURN
8100 GO TO 8005
8500 REM edit
8510 PRINT AT 0,0;"SYSOP EDITOR";AT 2,0;"<R>ead messages";AT 4,0;"<D>elete messages";AT 6,0;"<L>eave messages";AT 8,0;"<Q>uit editor";AT 10,0;"<S>ave message base"
8520 LET i$=INKEY$
8525 IF i$="" THEN GO TO 8520
8526 IF i$="s" OR i$="S" THEN GO TO 9999
8530 IF i$="r" OR i$="R" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x: PRINT m$(x): PAUSE 0: GO TO edit
8540 IF i$="d" OR i$="D" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x;" deleted.": LET m$(x)=l$: PAUSE 0: GO TO edit
8550 IF i$="l" OR i$="L" THEN LET y1=y1+1: PRINT "Message # ";y1: PRINT : FOR x=1 TO 1000: PAUSE 0: LET m$(y1,x)=INKEY$: PRINT m$(y1,x);
8554 IF i$="l" OR i$="L" THEN IF CODE INKEY$=195 THEN LET m$(y1,x)=CHR$ 3: GO TO edit: REM 195=NOT
8560 IF i$="l" OR i$="L" THEN NEXT x: PAUSE 0: GO TO edit
8570 IF i$="q" OR i$="Q" THEN GO TO quit
8599 CLS : GO TO edit
9000 REM init
9001 REM 20 meesage base
9004 PAPER 0: BORDER 0: INK 7: CLS
9005 CLEAR 64999: GO SUB 9500
9006 DIM y(1,1): LET y1=0: DIM l$(1000): DIM m$(20,1000): LET m$(1)="No messages found..."+CHR$ 3: FOR x=1 TO 3: BEEP .1,25: NEXT x: PRINT "Do you wish to load a message base?": INPUT x$: IF x$="y" OR x$="Y" THEN PRINT "Start MESSAGE BASE tape... ( 2 Part LOAD... )": LOAD "" DATA m$(): LOAD "" DATA y(): LET y1=y(1,1)
9007 LET t$="T/S Tinyboard FLASHWARE <c> 1985": FOR x=1 TO 3: BEEP .1,25: NEXT x: PRINT "Do you wish to load a logon bulletin?": INPUT x$: IF x$="y" OR x$="Y" THEN PRINT "Start LOGON BULLETIN tape... ( with data as t$ )": LOAD "" DATA t$()
9008 PRINT : PRINT "<NOT> from most modes will exit to SYSOP control mode.": BEEP .1,35: BEEP .1,35: PAUSE 180
9009 LET y=0: LET edit=8500: LET timer=9990
9010 LET chat=7000: LET menu=2002: LET warmstart=2000: LET logonbull=6000: LET statchk=65000: LET input=65100: LET output=65200: LET ansloop=1010: LET inputcom=2005: LET autoans=1000: LET read=3000: LET leave=4000: LET quit=5000
9011 LET inname=8000
9012 PRINT "Now going to AUTOANSWER MODE": FOR x=1 TO 3: BEEP .1,10: NEXT x: PAUSE 180: CLS
9100 GO TO quit
9500 REM code
9510 RESTORE 9515: FOR x=65000 TO 65008: READ x1: POKE x,x1: NEXT x
9515 DATA 175,219,119,230,3,79,6,0,201
9520 RESTORE 9525: FOR x=65100 TO 65132: READ x1: POKE x,x1: NEXT x
9525 DATA 219,119,230,128,200,175,219,119,230,2,40,244,219,115,6,0,79,219,119,230,128,200,175,219,119,230,1,40,244,121,211,115,201
9530 RESTORE 9535: FOR x=65200 TO 65212: READ x1: POKE x,x1: NEXT x
9535 DATA 219,119,230,128,200,175,219,119,230,1,40,244,201
9540 RETURN
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 21,0;"0" AND hr<10;hr;":";"0" AND min<10;min: FOR x=1 TO 5: LET x$(x)=SCREEN$ (21,x-1): NEXT x
9993 RETURN
9995 INK 7: BORDER 0: PAPER 0: CLS : PRINT AT 3,10;"T/S Tinyboard";AT 14,8;"FLASHWARE \* 1986": CIRCLE 123,110,20: PLOT 127,133: DRAW 20,0: DRAW -5,-20: DRAW -15,0: DRAW -5,-10: DRAW -8,0: DRAW -6,-17: DRAW 0,23: DRAW 6,0: DRAW 4,9: DRAW 6,0: DRAW 2,15: BEEP .2,10: BEEP .2,5: BEEP .2,2: PAUSE 4: BEEP .2,10: BEEP .2,5: BEEP .2,2: PAUSE 8: BEEP .2,10: BEEP .2,5: BEEP .2,2: BEEP .2,5: BEEP .2,10: BEEP .2,10
9996 GO TO 10
9997 SAVE "tinyboard" LINE 9995: REM T/S Tinyboard/Flashware \* 1986 rev. date 01/21/86
9998 STOP
9999 SAVE "messbase" DATA m$(): LET y(1,1)=y1: SAVE "msgcntr" DATA y(): GO TO edit