A group of programs used to host BBSs. Recovered from several unlabeled cassettes.
Includes:
- 1stUG BBS
- A & J BBS
- Farmers BBS
- Ralph BBS
- TSBBS
The first three programs (1stUG BBS, A&J BBS, and Farmers BBS) share a common ancestry in a package called “TSTinyboard”, with each operator customizing the DATA statements, welcome messages, and sysop access credentials; the fourth (TS-BBS, attributed to “Willie’s TS-BBS”) is a more independently structured variant with a separate user-file system tracking up to 50 users with passwords, call counts, and message-waiting flags.
All four programs use RANDOMIZE USR with fixed machine code addresses to transmit and receive serial data through the modem port (OUT 119 for modem control, OUT 115 for serial data output), and the machine code routines are POKEd in from DATA statements at initialization.
The programs store up to 20 or 40 messages in a dimensioned string array and use CHR$ 3 (ETX) as an end-of-message sentinel; message bases can be saved and loaded from tape or microdrive.
Line-number variables (such as nl, sm, beep, menu, cls, con, leave, chat, edit, quit) are used throughout as indirect GO TO/GO SUB targets.
Program Analysis
Overview and Family Relationships
These four programs represent a family of BBS implementations sharing a common codebase called “TSTinyboard,” credited to Randy & Lucy Gordon and extensively modified by Paul Holmgren (PEH Software, 1986). The 1stUG BBS, A&J BBS, and Farmers BBS are all derivatives of TSTinyboard, while TS-BBS (“Willie’s TS-BBS”) is a more ambitious independent rewrite with a full user database. All four target a 300-baud modem on port 119 (modem control) and port 115 (serial data), consistent with the TS2050 modem hardware.
Machine Code Routines
All four programs rely on small machine code stubs POKEd from DATA statements at startup. These routines handle serial I/O at addresses that vary slightly between implementations:
- 1stUG/Ralph BBS:
rcv=26724,xmt=26759— fixed ROM entry points for receive and transmit. - A&J BBS: Machine code is POKEd to addresses
65000–65212; three separate routines handle status check (statchk=65000), receive (input=65100), and transmit (output=65200). - Farmers BBS: Same three-routine layout as A&J BBS, POKEd to the same addresses, with identical DATA byte sequences.
- TS-BBS: Loads machine code from a separate cassette file named
bbsmcusingLOAD "bbsmc"CODE, storing 2200 bytes at address 65000.
The A&J and Farmers BBS DATA bytes for the receive routine (65100–65145) implement a polling loop: IN 119 checks modem status, tests bit 7 (carrier detect, AND 128), times out to return 0, then reads a byte from port 115 when ready. The transmit routine at 65200 similarly polls for the transmit-ready bit before outputting.
Program Structure
All four programs follow a similar call flow:
- Initialization: dimension arrays, POKE machine code, set line-number variables as indirect jump targets.
- Auto-answer loop: poll
IN 119for ring indication (value 5), answer withOUT 119,2thenOUT 119,34. - Warm start: configure UART registers (
OUT 119,64;OUT 119,123;OUT 119,55for 7-bit even parity, 1 stop bit). - Logon bulletin, caller name input, main menu dispatch.
- Message read/leave, chat, quick scan, utilities, and sysop editor.
- Disconnect:
OUT 119,64;OUT 119,0to drop carrier.
Line-Number Variables as Jump Targets
The 1stUG and Ralph BBS programs make heavy use of numeric variables holding line numbers, used as the destination in GO TO ret or GO SUB nl. Examples include nl=30, sm=41, beep=60, menu=270, cls=380, con=580. This avoids storing literal line numbers in every branch, saving tokenized program space. GO TO VAL "number" is also used extensively for the same reason, preventing the interpreter from storing a two-byte line-number reference.
Message Storage
Messages are stored in a dimensioned string array m$. The field layout is consistent across the TSTinyboard family:
| Columns | Content |
|---|---|
| 1–32 | “TO: ” + recipient name |
| 33–64 | “FROM: ” / “From: ” + sender name |
| 65–end | Message body, terminated by CHR$ 3 (ETX) |
The 1stUG and Ralph BBS use DIM m$(41,600) (40 user messages plus one sysop slot at index sm=41). A&J and Farmers BBS use DIM m$(20,1000), allowing longer messages but fewer slots. TS-BBS uses DIM m$(50,500) with a separate parallel array m(50) tracking whether each slot is occupied.
Date/Time Handling
All programs use the system frame counter at addresses 23672–23674 (the three-byte ticker incremented 50 times per second). Time is reconstructed by reading PEEK 23672 + 256*PEEK 23673 + 65536*PEEK 23674 and dividing by 3600 (frames per hour at 50 Hz). The 1stUG BBS contains a notable bug in its timer: it divides by beep (which is set to 60 at line 1860) rather than 60 to get hours, meaning the time computation uses the correct divisor only by coincidence of the variable’s value. Ralph BBS corrects this by using 60 explicitly in the arithmetic. TS-BBS resets the clock to zero at logon (POKE 23672,0 etc.) to measure session duration rather than wall time.
Serial Output Idiom
The standard idiom for sending a character to the caller combines local screen display with remote transmission:
POKE 23692,255: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x)
The POKE 23692,255 resets the scroll counter to prevent the “scroll?” prompt. RANDOMIZE USR output calls the transmit-ready polling routine (return value is discarded by RANDOMIZE), and OUT 115,CODE p$(x) sends the byte. Some routines call the machine code address directly via USR and test the return value for carrier-detect.
Chat Mode
All four programs implement a half-duplex chat mode. The A&J and Farmers BBS versions call a status-check routine at address 65000 that returns 1 (transmit ready), 2 (receive ready), or 3 (both). The 1stUG and Ralph BBS chat modes use USR 26715 for the same purpose. TS-BBS implements chat similarly at line 7100. The sysop exits chat via SYMBOL SHIFT+NOT (producing the token STEP in the listing — rendered as the keyword token — code 195).
Sysop Editor
Each program includes a local sysop editor accessible by pressing NOT/STEP on the sysop’s keyboard. The editor provides read, delete, and leave-message operations operating directly on the m$ array, as well as clock-set and save functions. The 1stUG and Ralph BBS editors use PAUSE ed (where ed=NOT PI=0 normally, meaning no pause) as a convenient zero-wait. When the sysop is composing a message via the editor, ed is set to a non-zero value to signal the message-entry routine to store the result differently.
A&J BBS: Dual Message Base
The A&J BBS adds a message-base switching feature absent from the other three. Two bases (“General” and “Humor/Insults”) are stored on separate microdrive files (@mess1/@msg1 and @mess2/@msg2). Switching saves the current base and loads the other atomically. Message counters y1–y4 track the circular write pointer, total message count, and bank number, stored in a DIM y(4,1) array saved alongside the message data.
TS-BBS: User Database
TS-BBS is the most feature-complete of the four. It maintains arrays f$(50,20) (first names), l$(50,20) (last names), w$(50,8) (passwords), z$(50) (last-call date), t(50) (call count), and w(50) (message-waiting count). New users are prompted for a password and welcomed; returning users are verified against their stored password and shown their call count and last-call date. The getkey subroutine at line 7235 implements a full line-input buffer with backspace handling and CTRL-C termination, used consistently throughout.
Notable Bugs and Anomalies
- 1stUG BBS line 210:
LET temp=hr*beep+minusesbeep=60as a multiplier for hours, which accidentally produces the correct result (hours×60+minutes = total minutes), but the variable name is misleading and its reuse for BEEP loop counts at line 70 is confusing. - Farmers BBS: The auto-answer loop at lines 40–120 references
GO TO 40but line 40 does not exist; this is a valid technique that causes execution to fall through to the next available line. - A&J BBS line 2744: The subroutine starting at line 2744 (
IF y3>20 THEN LET y2=y2+1: RETURN) is never reachable by a directGO SUB 2744call — line 2740 containsGO SUB 2740and line 2754 the counter-wrap; line 1600 callsGO SUB 2744which would fall into line 2754 directly. - TS-BBS line 7150: References
GO TO 7010, which does not exist; execution falls to line 7015 (the POKE 23692 line), which is harmless but slightly wasteful. - Ralph BBS line 910:
LPRINT "Tried caht"— “chat” is misspelled as “caht.”
Content
Source Code
1stUG BBS
0 REM CODE FLASH w NEW O<>CODE FLASH w NEW >=CODE FLASH w NEW ( POKE FLASH sO FLASH w NEW >=CODE FLASH w NEW ( POKE y OPEN #s<>CODE FLASH w NEW >=CODE FLASH w NEW ( POKE <>
10 GO TO VAL "1820"
20 REM send a nl= NEW LINE
30 POKE 23692,255: PRINT : RANDOMIZE USR xmt: OUT 115,nlv: RETURN
40 REM PRINT TO caller
50 GO SUB nl: PRINT p$;: FOR x=SGN PI TO LEN p$: RANDOMIZE USR xmt: OUT 115,CODE p$(x): NEXT x: RETURN
60 REM BEEP
70 FOR x=9 TO 2 STEP -SGN PI: BEEP .2,15: NEXT x: RETURN
80 REM test FOR sysop access
90 IF IN mc<128 THEN GO TO VAL "1250"
100 IF INKEY$="c" OR INKEY$="C" THEN GO TO chat
110 IF INKEY$="NOT " THEN GO TO edit
120 GO TO ret
130 REM CLOSE # modem
140 GO SUB VAL "1770"
150 OUT mc,34: OUT mc,ed
160 REM test FOR IN call
170 GO SUB VAL "1290": PRINT AT 17,27;T$(2): LET ret=VAL "180": GO TO VAL "110"
180 IF IN mc=5 THEN GO TO 170
190 OUT mc,2: OUT mc,34: PAUSE ret
200 REM start/set on LINE time
210 ON ERR GO TO 1250: OUT mc,64: OUT mc,123: OUT mc,55: GO SUB beep: LET temp=hr*beep+min
220 LET nlv=CODE l$: LET p$="Hello"+l$+"Hello, Is this 2 lines Y/N >": GO SUB sm
230 LET c$=CHR$ USR rcv: IF c$="y" OR c$="Y" THEN GO TO VAL "1020"
240 IF c$="n" OR c$="N" THEN LET nlv=10: GO TO VAL "1020"
250 GO TO 230
260 REM menu
270 RESTORE VAL "1350": ON ERR GO TO VAL "1720": GO SUB cls: GO SUB 1160
280 LET p$="(C,G,L,Q,R,T,U)? ": GO SUB sm: LET c$=CHR$ USR rcv: PRINT c$: GO SUB nl
290 IF c$="c" OR c$="C" THEN GO TO chat
300 IF c$="g" OR c$="G" THEN GO TO quit
310 IF c$="l" OR c$="L" THEN GO TO leave
320 IF c$="q" OR c$="Q" THEN GO TO VAL "840"
330 IF c$="r" OR c$="R" THEN GO SUB nl: GO TO read
340 IF c$="t" OR c$="T" THEN GO SUB VAL "1290": GO SUB sm: GO TO VAL "280"
350 IF c$="u" OR c$="U" THEN GO TO VAL "1190"
360 GO TO VAL "280"
370 REM CLS SCREEN$ ,12=FF
380 CLS : OUT 115,12: RETURN
390 REM FORMAT & READ header
400 LET p1=32: LET p2=64: LET c$=m$(y, TO p2): FOR x=5 TO p2
410 IF c$(x)=l$ AND x<=32 THEN LET p1=x: LET x=39
420 IF c$(x)=l$ AND (x>32) AND (x<=64) THEN LET p2=x: LET X=64
430 NEXT x: LET p$="Message :"+STR$ y+" "+d$(y*14-13 TO y*14)+l$+c$( TO p1)+c$(33 TO p2): RETURN
440 REM READ mess
450 LET p$="Message 1 to 40, Menu=0 >? ": GO SUB sm: LET c$=" ": ON ERR GO TO menu
460 FOR x=SGN x TO PI: LET c$(x)=CHR$ USR rcv: IF c$(2)=l$ THEN LET c$=c$(SGN PI): GO TO VAL "500"
470 IF c$(PI)=l$ THEN LET c$=c$( TO 2): GO TO VAL "500"
480 IF (c$(x)<"0") OR (c$(x)>"9") THEN GO TO VAL "450"
490 NEXT x: IF LEN c$>2 THEN GO TO read
500 GO SUB nl: LET y=VAL c$: IF NOT y THEN GO TO menu
510 IF m$(y,1)=" " THEN GO TO VAL "1760"
520 GO SUB 390: LET p$=p$+m$(y,65 TO )
530 GO SUB cls: PRINT ''"Working": FOR x=SGN PI TO LEN p$: LET c=CODE p$(x): IF c=3 THEN GO TO VAL "560"
540 RANDOMIZE USR xmt: OUT 115,c
550 NEXT x: LET x=x-SGN PI
560 GO SUB nl: PRINT p$( TO x): LPRINT "Read mess. "+STR$ y: GO TO VAL "450"
570 REM con= CONTINUE
580 GO SUB nl: LET p$="Press <ENTER> when ready": GO SUB sm
590 IF CHR$ USR rcv=l$ THEN GO TO ret
600 GO TO VAL "590"
610 REM leave message
620 GO SUB CLS: LET p$="Is this message for Sysop Y/N>": GO SUB sm: LET c$=CHR$ USR rcv: IF c$="y" OR c$="Y" THEN GO TO VAL "1800"
630 GO SUB nl: FOR y=SGN PI TO VAL "40"
640 IF m$(y,1)=" " THEN GO TO VAL "660"
650 NEXT y: GO TO VAL "1740"
660 IF ed THEN GO TO VAL "1670"
670 LPRINT "Left mess. #";y
680 LET p$="Who Gets Mess. "+STR$ y+"?": GO SUB sm: GO SUB nl: LET m$(y)="TO: ": FOR x=5 TO 31
690 LET m$(y,x)=CHR$ USR rcv: IF m$(y,x)=CHR$ 8 THEN LET x=x-SGN PI: GO TO 690
700 IF m$(y,x)=l$ THEN GO TO VAL "720"
710 PRINT m$(y,x);: NEXT x: LET m$(y,x)=l$
720 LET m$(y,33 TO )="From: "+n$: LET p$="Input Message (535 chars max).. <CTRL C> to save...": GO SUB sm: GO SUB nl
730 LET ret=VAL "780": FOR x=CODE "A" TO VAL "600"
740 LET c=USR rcv: IF c=8 THEN LET x=x-SGN x: GO TO VAL "740"
750 IF x<65 THEN GO TO VAL "720"
760 LET m$(y,x)=CHR$ c: PRINT m$(y,x);: IF c=INT PI THEN GO TO VAL "790"
770 GO TO 90
780 NEXT x: LET x=VAL "600"
790 IF ed THEN LET ed=x
800 LET p$="Message"+(" full and" AND x>=600)+" saved.": GO SUB sm: GO SUB 830: IF ed THEN GO TO VAL "1810"
810 GO TO VAL "870"
820 REM FORMAT date/time
830 GO SUB 1290: LET d$(y*14-13 TO y*14)=p$: RETURN
840 REM Quick scan
850 LET ret=VAL "860": FOR y=SGN PI TO 40: IF m$(y,1)<>" " THEN GO SUB 390: GO SUB sm: IF NOT ed THEN GO TO 90
860 NEXT Y: IF ed THEN LET ed=NOT PI: GO TO VAL "1710"
870 LET ret=menu: GO TO con
880 REM chat
890 LET p$="Paging sysop....": GO SUB sm
900 FOR x=SGN x TO VAL "144": IF INKEY$="" THEN PRINT ".";: RANDOMIZE USR xmt: OUT 115,46: BEEP .1,15: NEXT x: LET p$="Sorry, all we found were cobwebs": GO SUB sm: LPRINT "Tried Chat": PAUSE con: GO TO menu
910 GO SUB cls: LET p$=N$+"entering chat mode": GO SUB sm: GO SUB nl: POKE 23658,ed: PRINT '"SYMBL SHIFT/NOT TO LEAVE CHAT"
920 IF INKEY$="NOT " THEN GO TO edit
930 LET rcv1=ed: LET xmt1=ed
940 LET x=USR 26715: LET Xmt1=x AND (x=1 OR x=3): LET Rcv1=x AND (x=2 OR x=3)
950 IF Rcv1 THEN LET c=USR rcv: PRINT CHR$ c;: IF c=CODE l$ THEN PRINT '">";
960 IF Xmt1 AND INKEY$<>"" THEN GO TO 980
970 GO TO 920
980 IF Xmt1 THEN LET c$=INKEY$: PRINT c$;: OUT 115,CODE c$: FOR x=NOT PI TO PI: NEXT x: IF c$=l$ THEN RANDOMIZE USR xmt: OUT 115,62
990 IF INKEY$<>"" THEN GO TO 990
1000 GO TO 920
1010 REM send logon SCREEN$
1020 RESTORE VAL "1380": GO SUB cls: GO SUB VAL "1160": LET ret=VAL "1040": GO TO con
1030 REM send bulletin
1040 RESTORE VAL "1410": GO SUB cls: GO SUB VAL "1160"
1050 REM INPUT callers name
1060 LET p$="Who's calling?"+l$: GO SUB sm: LET N$=" ": RANDOMIZE USR xmt: OUT 115,5: GO SUB beep: FOR x=SGN x TO LEN n$
1070 LET n$(x)=CHR$ USR rcv: IF n$(x)=CHR$ 8 THEN LET x=x-SGN PI: GO TO 1070
1080 IF x<SGN PI THEN GO TO VAL "1060"
1090 IF n$(x)=l$ THEN GO TO 1110
1100 PRINT n$(x);: NEXT x: LET x=x-SGN PI: LET n$=n$+l$
1110 LET n$=n$( TO x): IF LEN n$<5 THEN GO TO VAL "1060"
1120 LET p$=N$+"Correct (Y/N) >": GO SUB sm: LET c$=CHR$ USR rcv
1130 IF c$="n" OR c$="N" THEN GO TO 1060
1140 GO SUB nl: GO SUB 1290: LPRINT N$'p$( TO 14): GO TO menu
1150 REM send SCREEN$ DATA
1160 READ y: LET ret=VAL "1170": FOR y=SGN PI TO y: READ p$: GO SUB sm: GO TO 90
1170 NEXT y: RETURN
1180 REM user LIST
1190 RESTORE VAL "1440": GO SUB cls: GO SUB VAL "1160": LET ret=menu: GO TO con
1200 REM quit bbs
1210 GO SUB cls
1220 RESTORE VAL "1500": GO SUB VAL "1160"
1230 LET C$=CHR$ USR rcv: IF c$="n" OR c$="N" THEN GO TO menu
1240 READ p$: GO SUB sm: GO SUB VAL "1290": GO SUB sm: LPRINT p$'': OUT mc,64: OUT mc,0
1250 OUT mc,0: GO TO VAL "140"
1260 REM timer
1270 LET time=VAL "INT ((PEEK 23672+256*PEEK 23673+65536*PEEK 23674)/3600)": LET hr=INT (time/beep): LET min=INT (time-hr*beep): IF hr>=24 THEN LET hr=NOT PI: LET dy=dy+SGN PI: GO SUB VAL "1910"
1280 RETURN
1290 GO SUB 1270: LET time=INT ((hr*beep+min)-temp)
1300 LET p1=INT (time/beep): LET p2=INT (time-(p1*beep)): IF p1<NOT x THEN LET p1=p1+24
1310 LET c=SGN PI: GO SUB 1330: LET c=2: LET p1=hr: LET p2=min: GO SUB 1330
1320 LET p$=STR$ mo+"-"+STR$ dy+"-"+STR$ yr+";"+t$(2)+" Online "+t$(1)+l$: RETURN
1330 LET t$(c)=("0" AND LEN STR$ p1=SGN PI)+STR$ p1+":"+("0" AND LEN STR$ p2=SGN PI)+STR$ p2: RETURN
1340 REM menu DATA
1350 DATA 10," I.S.T.U.G.'s TIMEX-BOARD","","<C>hat","<G>oodby","<L>eave a Message"
1360 DATA "<Q>uick Scan messages","<R>ead message","<T>ime on","<U>sers list",""
1370 REM logon DATA
1380 DATA 15," WELCOME TO I.S.T.U.G.'s BBS","-------------------------------- ","Settings:","DUPLEX: FULL WORD SIZE: 7","PARITY: EVEN STOP BITS: 1",""
1390 DATA "","We are operating on an unex-","panded Timex 2068, a 2050 modem","and a 2040 printer.","","Tell us what you think about","this BBS","","Open 24hrs a day, 7 days a week"
1400 REM Bull DATA
1410 DATA 8,"Sysop: Willie Jones","Mad Programmer: Paul Holmgren","","**** >>> -Bullentin- <<< **** "
1420 DATA "","Keep your Modem's warm and stay","tuned to the I.S.T.U.G. BBs",""
1430 REM USR DATA
1440 DATA 8,""
1450 DATA ""
1460 DATA ""
1470 DATA ""
1480 DATA "","If we missed you please Leave","Sysop a mess. and you will be","added to our list."
1490 REM quit DATA
1500 DATA 8,"","The Indiana Sinclair/Timex","","Users Group hopes you enjoyed"
1510 DATA "","our little Bulletin Board.","","Are you ready to leave Y/N >","Goodby. Hanging up now"
1520 REM edit
1530 ON ERR RESET
1540 LET p$="Commander Sysop taking Control, Please Stand By": GO SUB sm
1550 CLS : PRINT "SYSOP EDITOR"''"C heck Time"'"D elete a mess."'"E stablish correct time"'"H ang up"'"L eave a mess."'"M ain Menu"'"Q uick Scan Mess."'"R ead Mess."'"S ave messages"''"(C,D,E,H,L,M,Q,R,S)"
1560 POKE VAL "23658",VAL "8": PAUSE ed: LET c$=INKEY$
1570 IF c$="C" THEN GO SUB VAL "1290": PRINT p$( TO 14): GO TO VAL "1710"
1580 IF c$="D" THEN INPUT "DELETE Mess. #?: ";x: PRINT "Mess. # ";x;" deleted.": LET m$(x)="": GO TO VAL "1710"
1590 IF c$="E" THEN GO SUB VAL "1900"
1600 IF c$="H" THEN GO TO quit
1610 IF c$="L" THEN LET ed=nl: GO TO VAL "630"
1620 IF c$="M" THEN GO TO menu
1630 IF c$="Q" THEN LET ed=nl: GO TO VAL "840"
1640 IF c$="R" THEN INPUT " READ Mess. #?: ";y: CLS : GO SUB VAL "390": PRINT p$'m$(y,CODE "A" TO ): GO TO VAL "1710"
1650 IF c$="S" THEN LET m$(sm)=d$: SAVE "TSBBSmbase" DATA m$()
1660 GO TO VAL "1550"
1670 CLS : LET ed=NOT PI: INPUT " SYMBL SHIFT/NOT TO STOP :"'"Mess. TO ? ";p$: LET m$(y)="To :"+p$+l$: LET m$(y,VAL "33" TO )="From : Sysop Willie"+l$: GO SUB VAL "830": GO SUB VAL "390": PRINT P$: LET p$=""
1680 INPUT LINE c$: IF c$="NOT " THEN LET p$=p$+CHR$ PI: GO TO VAL "1700"
1690 LET p$=p$+c$+l$: PRINT c$: IF LEN p$<=VAL "535" THEN GO TO VAL "1680"
1700 LET m$(y,CODE "A" TO )=p$: PRINT
1710 PRINT " NEXT ?": PAUSE ed: GO TO VAL "1550"
1720 REM error trapped messages
1730 ON ERR RESET : LET p$="Sorry "+N$+" A bug has Bit you,": GO SUB sm: GO SUB beep: GO TO menu: REM ?=control G= BEEP
1740 IF ed THEN PRINT "I'm full, delete something first": LET ED=NOT X: GO TO VAL "1710"
1750 LET p$="Message base full right now. Please try later": GO SUB sm: GO TO con
1760 LET ret=read: LET p$="Sorry no message "+STR$ y+". Try again": GO SUB sm: GO SUB nl: GO TO con
1770 REM idle SCREEN$
1780 CLS : PRINT AT VAL "7",VAL "7";"The I.S.T.U.G. BBS";AT VAL "10",VAL "6";"Scanning Phone Line."'''''''"* PEH SOFTWARE: 9-27-86": RETURN
1790 REM LPRINT sysop mess
1800 GO SUB cls: LET y=sm: LET m$(y)="": LET ed=y: GO TO VAL "720"
1810 LPRINT n$;m$(sm,65 TO ed): LET ed=NOT PI: GO TO menu
1820 REM OPEN # 40 mess. base
1830 PAPER NOT PI: BORDER NOT PI: INK VAL "9": CLS
1840 PRINT '" NOT from most modes will GO TO SYSOP edit menu."
1850 LET rcv=VAL "26724": LET xmt=VAL "26759": DIM T$(2,5): LET temp=PI: LET nlv=VAL "13": LET mc=VAL "119"
1860 LET nl=VAL "30": LET sm=VAL "41": LET beep=VAL "60": LET menu=VAL "270": LET cls=VAL "380": LET read=VAL "450": LET con=VAL "580": LET leave=VAL "620": LET chat=VAL "890": LET edit=VAL "1530": LET quit=VAL "1210": LET l$=CHR$ 13: DIM m$(VAL "41",VAL "600"): LET ed=NOT PI
1870 INPUT "Add a Message base? ";p$: IF p$="y" OR p$="Y" THEN PRINT "Start MESSAGE BASE tape.": LOAD "" DATA m$()
1880 LET d$=m$(sm): GO TO edit
1890 REM FORMAT & POKE clock
1900 INPUT "Month 1-12 ";mo,"Day 1-31 ";dy,"Hour 00-23 ";hr,"Minute ";min,"Year 86 ";yr
1910 LET x=VAL "(hr*3600+min*60)*60": LET y=INT (x/65536): POKE 23674,y
1920 LET p1=x-y*65536: LET x=INT (p1/256): POKE 23673,x: POKE 23672,p1-x*256: RETURN
1930 REM SAVE
1940 CLEAR : SAVE "BBS" LINE VAL "1820": GO TO VAL "1820"
A&J BBS
1 REM TS TINYBOARD * by Randy & Lucy Gordon
2 REM Modifyed for use on A&J microdrive by John Ryan
10 GO TO 1700
20 IF uu=1 OR uu=3 OR uu=7 OR uu=8 OR uu=10 OR uu=13 THEN RETURN
80 IF uu<32 OR uu>127 THEN LET uu=0
90 RETURN
100 LET ty=INT VAL "((65536*PEEK 23674+256*PEEK 23673+PEEK 23672)/3600)"
110 LET ht=INT (ty/60)
130 LET mt=INT (ty-ht*60)
140 IF ht=24 THEN LET ht=0: LET dy=dy+1
150 RETURN
160 REM autoans
170 OUT 119,34
180 OUT 119,0
190 REM ansloop
200 GO SUB 100
220 IF INKEY$="NOT " THEN GO TO 1520
230 IF IN 119=5 THEN GO TO 190
240 FOR x=1 TO 5: BEEP .1,40: NEXT x
250 OUT 119,2
260 OUT 119,34
270 PAUSE 300
280 REM warmstart
290 OUT 119,64: OUT 119,123: OUT 119,55: LET tw=INT mt: REM set online timer
300 REM menu
310 PAUSE 120: GO SUB 1160
330 PAUSE 120: CLS : LET x=IN 115: LET p$="Full name: ": LET p$=p$+CHR$ 7: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: GO SUB 1420: LPRINT u$
340 RESTORE 350: PAUSE 200
350 DATA "The Rats Den","MAIN MENU","<R>ead messages","<L>eave message","<C>hat with Fat Rat Daddy","<T>ime on","<G>oodbye","<I>nfo files","<M>essage base change"," ","Choice?:"
360 RANDOMIZE USR output: OUT 115,13: PRINT
370 FOR p=1 TO 11: 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
380 NEXT p
390 IF INKEY$="c" THEN GO TO 1300
400 ON ERR GO TO 1030: LET uv=0: LET uu=USR input: GO SUB 20: LET c$=CHR$ uu
410 IF uv=60 THEN GO TO 1030
420 IF c$=CHR$ 0 THEN LET uv=uv+1: GO TO 400
430 PRINT c$: PRINT
440 IF c$="r" OR c$="R" THEN FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: NEXT x: GO TO 520
450 IF c$="t" OR c$="T" THEN RANDOMIZE USR output: OUT 115,13: GO SUB 2120: FOR x=1 TO LEN e$: RANDOMIZE USR output: OUT 115,CODE e$(x): NEXT x: GO SUB 2220: LET p$="Connect time ": LET p$=p$+x$(1): 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 340
460 IF c$="c" OR c$="C" THEN GO TO 1260
470 IF c$="g" OR c$="G" THEN PAUSE 30: GO TO 1030
480 IF c$="i" OR c$="I" THEN GO TO 2270
490 IF c$="l" OR c$="L" THEN GO TO 780
500 IF c$="m" OR c$="M" THEN GO SUB 2760
510 GO TO 340
520 REM read messages
530 RANDOMIZE USR output: OUT 115,13
540 LET p$="Messages from "+STR$ y2+" to "+STR$ y3+"...Which one?": RANDOMIZE USR output: OUT 115,13
550 FOR x=1 TO LEN p$: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: RANDOMIZE USR output: OUT 115,13: LET uv=0
560 DIM q$(3): FOR x=1 TO 3: LET uu=USR input: GO SUB 20: LET q$(x)=CHR$ uu:: IF q$(x)=CHR$ 8 THEN LET x=x-1: NEXT x
570 IF q$(x)=CHR$ 13 THEN LET x=3: GO TO 620
580 IF uv=60 THEN LET x=3: NEXT x
590 IF q$(x)=CHR$ 0 THEN LET x=x-1: LET uv=uv+1: GO TO 620
600 IF CODE q$(x)>0 THEN LET uv=0: PRINT q$(x);
610 IF CODE q$(x)<48 OR CODE q$(x)>57 THEN LET q$(x)="0"
620 NEXT x: RANDOMIZE USR output: OUT 115,13: IF q$(1)=CHR$ 13 THEN GO TO 520
630 IF uv=60 THEN GO TO 1030
640 ON ERR GO TO 1030: LET y5=VAL q$: IF INT y5<y2 OR INT y5>y3 THEN GO TO 530
650 LET y=INT y5: IF y5>20 THEN LET y=INT (y5-(20*y4))
660 IF y<0 THEN LET y=y+20
670 IF m$(y,1)=" " THEN RANDOMIZE USR output: OUT 115,13: LET p$="No message at that number...try another": FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: GO TO 520
680 LET p$="MESSAGE NUMBER: "+STR$ y5+CHR$ 13: 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 : PRINT
690 FOR v=1 TO 1000: POKE 23692,255
700 IF CODE m$(y,v)=3 THEN LET v=1000: NEXT v: GO TO 340
710 PRINT m$(y,v);: RANDOMIZE USR output: OUT 115,CODE m$(y,v)
720 IF v>64 THEN NEXT v
730 IF (v>32 AND CODE m$(y,v)=13) THEN LET v=64: RANDOMIZE USR output: OUT 115,13
740 IF (v<32 AND CODE m$(y,v)=13) THEN LET v=32
750 NEXT v
760 RANDOMIZE USR output: OUT 115,13: PRINT
770 GO TO 340
780 REM leave message
790 LET y1=y1+1: IF y1>20 THEN LET y1=1
800 LET y3=y3+1
810 IF y3>20 THEN LET y2=y2+1
820 LET y4=INT (y3/20)
830 DIM l$(1000): LET m$(y1)=l$
840 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 1030: LET uv=0: LET m$(y1,1 TO 4)="TO: ": FOR x=5 TO 32: LET uu=USR input: GO SUB 20
850 IF uv=60 THEN LET x=32: NEXT x
860 IF uu=0 THEN LET x=x-1: LET uv=uv+1: NEXT x
870 IF uu=8 THEN LET x=x-1: LET uv=0: NEXT x
880 LET m$(y1,x)=CHR$ uu: PRINT m$(y1,x);: LET uv=0
890 IF CODE m$(y1,x)=13 THEN LET x=32
900 NEXT x
910 IF uv=60 THEN GO TO 1030
920 LET m$(y1,33 TO 38)="FROM: ": LET m$(y1,39 TO 64)=u$
930 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
940 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
950 ON ERR GO TO 1030: LET uv=0: FOR v=65 TO 999: POKE 23692,255: LET uu=USR input: GO SUB 20: REM ctrl C=03h=ETX
960 IF uv=60 THEN LET v=999: GO TO 1000
970 IF uu=8 THEN LET v=v-1: LET uv=0
980 IF uu=0 THEN LET v=v-1: LET uv=uv+1: NEXT v
990 LET m$(y1,v)=CHR$ uu: PRINT m$(y1,v);: LET uv=0: IF uu=3 THEN LET v=1000: NEXT v: LET m$(y1,1000)=CHR$ 3: GO TO 340
1000 NEXT v: LET m$(y1,1000)=CHR$ 3
1010 IF uv=60 THEN GO TO 1030
1020 GO TO 340
1030 REM quit message base
1040 ON ERR GO TO 1030
1050 IF y1<>0 THEN LET m$(y1,1000)=CHR$ 3
1060 RANDOMIZE USR output: OUT 115,13
1070 CLS : PAUSE 10
1080 LET p$="Thank you for calling the The Rat's Den"
1090 LET p$=p$+CHR$ (13)
1100 PAUSE 30: CLS : RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
1110 RESTORE 2070: GO SUB 1120: FOR z=1 TO 5: READ p$: LET p$=p$+CHR$ (13): GO SUB 1120: NEXT z: GO TO 1130
1120 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: RETURN
1130 PAUSE 120
1140 OUT 119,64: OUT 119,0: OUT 119,0
1150 PAUSE 60: CLS : GO TO 160
1160 REM logonbull
1170 PAUSE 30: FOR x=1 TO 30: RANDOMIZE USR output: OUT 115,0: NEXT x
1180 IF IN 119<128 THEN GO TO 1030
1190 RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
1200 RANDOMIZE USR 65200: OUT 115,28
1210 FOR x=1 TO 17: RANDOMIZE USR 65200: OUT 115,13: PRINT : NEXT x
1220 RESTORE 1970
1230 FOR z=1 TO 10: READ t$: LET t$=t$+CHR$ 13: FOR x=1 TO LEN t$: POKE 23692,255: PRINT t$(x);: RANDOMIZE USR 65200: OUT 115,CODE t$(x): NEXT x: OUT 115,13: NEXT z
1240 FOR x=1 TO 5: RANDOMIZE USR 65200: OUT 115,13: PRINT : NEXT x
1250 RETURN
1260 REM chat
1270 ON ERR GO TO 1030
1280 PRINT : RANDOMIZE USR 65200: OUT 115,13: LET p$="You want to talk to the Rat?!! AHAHAHA": 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
1290 FOR x=1 TO 128: IF INKEY$="" THEN PRINT ".";: BEEP .1,1: RANDOMIZE USR 65200: OUT 115,46: NEXT x: LET p$="FRD is not available.....": 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 320
1300 RANDOMIZE USR 65200: OUT 115,13: LET p$="Well, you've GOT him!:": 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
1310 CLS : PRINT "You are in chat mode with ";u$: PRINT : PRINT "SYMBL SHIFT/NOT to escape..."
1320 IF INKEY$="NOT " THEN GO TO 340
1330 POKE 23692,255
1340 LET RxRDY=0: LET TxRDY=0
1350 LET a=USR 65000: LET TxRDY=1 AND (a=1 OR a=3): LET RxRDY=1 AND (a=2 OR a=3)
1360 IF RxRDY THEN LET k=USR 65100: PRINT CHR$ k;: IF k=13 THEN PRINT ">";
1370 IF TxRDY AND INKEY$<>"" THEN GO SUB 1390
1380 GO TO 1320
1390 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 ">";
1400 IF INKEY$<>"" THEN GO TO 1400
1410 RETURN
1420 REM inname
1430 DIM u$(32): LET u=1
1440 RANDOMIZE USR output: OUT 115,5: LET uv=0
1450 ON ERR GO TO 1030: LET uu=USR input: GO SUB 20
1460 IF uv=200 THEN GO TO 1030
1470 IF uu=0 THEN LET uv=uv+1: GO TO 1450
1480 LET v$=CHR$ uu: PRINT v$;
1490 LET u$(u)=v$ AND u<32: LET u=u+1
1500 IF CODE v$=13 THEN RETURN
1510 LET uv=0: GO TO 1450
1520 REM edit
1530 CLS : PRINT "SYSOP EDITOR"''"<R>ead messages"''"<D>elete messages"''"<L>eave messages"''"<Q>uit editor"''"<S>ave message base"
1540 PRINT '"<B>reak program"''"<C>hange Mbase"
1550 LET i$=INKEY$
1560 IF i$="" THEN GO TO 1550
1570 IF i$="s" OR i$="S" THEN GO TO 2240
1580 IF i$="r" OR i$="R" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x: PRINT m$(x): PAUSE 0: CLS : GO TO 1520
1590 IF i$="d" OR i$="D" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x;" deleted.": LET m$(x)=l$: PAUSE 0: CLS : GO TO 1520
1600 IF i$="l" OR i$="L" THEN LET y1=y1+1: GO SUB 2740: LET y3=y3+1: GO SUB 2744: PRINT "Message # ";y1: PRINT : FOR x=64 TO 1000: PAUSE 0: LET m$(y1,x)=INKEY$: PRINT m$(y1,x);: IF CODE INKEY$=195 THEN LET m$(y1,x)=CHR$ 3
1610 IF i$="l" OR i$="L" THEN IF m$(y1,x)=CHR$ PI THEN GO TO 1670: REM 195=NOT
1620 IF i$="l" OR i$="L" THEN NEXT x: PAUSE 0: LET m$(y1,1000)=CHR$ 3: GO TO 1670
1630 IF i$="q" OR i$="Q" THEN GO TO 1030
1640 IF i$="b" OR i$="B" THEN ON ERR RESET : STOP
1650 IF i$="c" OR i$="C" THEN GO SUB 2890
1660 GO TO 1520
1670 INPUT "Message to:;";z$: LET m$(y1,1 TO 32)=z$(1 TO LEN z$)
1680 LET m$(y1,32)=CHR$ 13: LET m$(y1,33 TO 63)="From SYSOP": LET m$(y1,64)=CHR$ 13
1690 CLS : GO TO 1520
1700 REM init
1710 REM 20 meesage base
1720 PAPER NOT PI: BORDER NOT PI: INK 7: CLS
1730 CLEAR 64999
1740 DIM y(4,1): LET y1=0: LET y2=0: LET y3=0: LET y4=0: DIM l$(1000): DIM m$(20,1000): LET m$(1)="No messages found..."+CHR$ 3: PRINT "Do you wish to load a message base?": INPUT x$: IF x$="y" OR x$="Y" THEN LOAD "@mess1" DATA m$(): LOAD "@msg1" DATA y(): LET y1=y(1,1): LET y2=y(2,1): LET y3=y(3,1): LET y4=y(4,1)
1750 PRINT '"<NOT> from most modes will exit to SYSOP control mode.": LET mbase=1
1760 LET y=0
1770 LET output=65200: LET input=65100: LET statchk=65000
1780 INPUT "Day";dy
1790 INPUT "Hour";ht
1800 INPUT "Minute";mt
1810 INPUT "Month ";e$: LET e$=e$+" "
1830 LET aa=(ht*3600+mt*60)*60
1840 LET bz=INT (aa/65536): POKE 23674,bz
1850 LET cz=aa-bz*65536
1860 LET aa=INT (cz/256): POKE 23673,aa
1870 POKE 23672,cz-aa*256
1880 GO TO 1030
1890 REM code
1900 RESTORE 1910: FOR x=65000 TO 65008: READ x1: POKE x,x1: NEXT x
1910 DATA 175,219,119,230,3,79,6,0,201
1920 RESTORE 1930: FOR x=65100 TO 65145: READ x1: POKE x,x1: NEXT x
1930 DATA 1,255,255,119,230,128,200,175,219,119,230,2,32,10,11,120,177,32,240,6,0,14,1,201,219,115,6,0,79,219,119,230,128,200,175,219,119,230,1,40,244,121,211,115,201
1940 RESTORE 1950: FOR x=65200 TO 65212: READ x1: POKE x,x1: NEXT x
1950 DATA 219,119,230,128,200,175,219,119,230,1,40,244,201
1960 RETURN
1970 REM DATA area for logon bullitin. All logon messages
1980 REM must be DATA statementsthusly
1990 REM xxxx DATA "this is a line that will be sent"
2000 REM logon area
2010 REM ditto
2020 REM ditto
2030 REM ditto
2040 REM ditto
2050 REM ditto
2060 REM ditto
2070 REM LOGOFF message area, FORMAT same as for logon
2080 REM logoff area
2090 REM ditto
2100 REM ditto
2110 REM ditto
2120 DIM x$(2,5): GO SUB 100: LET time=INT mt
2130 LET tz=INT (time-tw)
2140 IF tz<0 THEN LET tz=INT (time+60-tw)
2150 LET hr=0
2160 IF tz>60 THEN LET hr=1: LET tz=tz-60
2170 LET min=tz
2180 PRINT : PRINT AT 21,0;"0" AND hr<10;hr;":";"0" AND min<10;min: FOR x=1 TO 5: LET x$(1,x)=SCREEN$ (21,x-1): NEXT x
2190 GO SUB 100
2200 PRINT : PRINT AT 21,0;"0" AND ht<10;ht;":";"0" AND mt<10;mt: FOR x=1 TO 5: LET x$(2,x)=SCREEN$ (21,x-1): NEXT x
2210 RETURN
2220 RANDOMIZE USR output: OUT 115,32: LET p$=STR$ dy+",1986"+CHR$ 13: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x
2230 LET p$="Time of day "+x$(2)+CHR$ 13: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x): NEXT x: RETURN
2240 INPUT "mbase1 or 2";change
2250 IF change=1 THEN SAVE "@2,mess1" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@3,msg1" DATA y(): GO TO 1520
2260 IF change=2 THEN SAVE "@4,mess2" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@5,msg2" DATA y(): GO TO 1520
2270 REM info files
2280 RANDOMIZE USR output: OUT 115,13
2290 RESTORE 2300
2300 DATA "Information Section","","","1-Info on this system","2-Info on Fat Rat Daddy"
2310 FOR x=1 TO 5: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
2320 RANDOMIZE USR output: OUT 115,13
2330 LET p$="Enter choice": PRINT p$: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
2340 ON ERR GO TO 1030: LET uv=0
2350 LET uu=USR input
2360 GO SUB 20
2370 IF uv=90 THEN GO TO 1030
2380 IF uu=0 THEN LET uv=uv+1: GO TO 2350
2390 IF CHR$ uu="1" OR CHR$ uu="2" THEN LET uv=0: GO TO 2410
2400 RANDOMIZE USR output: OUT 115,13: LET uv=0: GO TO 2330
2410 IF CHR$ uu="1" THEN RESTORE 2460
2420 IF CHR$ uu="2" THEN RESTORE 2580
2430 PRINT : RANDOMIZE USR output: OUT 115,13
2440 FOR x=1 TO 10: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
2450 GO TO 340
2460 REM INFO FILE AREA.. FORMAT ...same as for logon (10 lines
2470 REM in each info file)
2480 REM info file 1
2490 REM ditto
2500 REM ditto
2510 REM ditto
2520 REM ditto
2530 REM ditto
2540 REM ditto
2550 REM ditto
2560 REM last line must xxxx DATA ""
2570 DATA ""
2580 REM info file 2
2590 REM ditto
2600 REM ditto
2610 REM ditto
2620 REM ditto
2630 REM ditto
2640 REM ditto
2650 REM ditto
2660 REM ditto
2670 REM ditto
2680 DATA " "
2740 IF y1>20 THEN LET y1=y1-20
2750 RETURN
2754 IF y3>20 THEN LET y2=y2+1: RETURN
2760 RANDOMIZE USR output: OUT 115,13: RESTORE 2910: PAUSE 100
2770 FOR x=1 TO 4: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
2780 LET p$=("General" AND mbase=1)+("Humor" AND mbase=2)+" is active, change? (Y/N)"
2790 IF mbase=2 THEN LET p$="Humor"
2800 LET p$=p$+" is active, change? (Y/N)"
2810 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: RANDOMIZE USR output: OUT 115,13
2820 ON ERR GO TO 1030: LET uu=USR input: GO SUB 20: IF uu=0 THEN GO TO 2820
2830 IF CHR$ uu="n" OR CHR$ uu="N" THEN RETURN
2840 IF CHR$ uu="y" OR CHR$ uu="Y" THEN GO TO 2860
2850 GO TO 2800
2860 LET p$="That rumbling in the pipes means that we're flushing, STAND BY"
2870 LET p$=p$+CHR$ 13
2880 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
2890 IF mbase=1 THEN SAVE "@1,mess1" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@4,msg1" DATA y(): LOAD "@mess2" DATA m$(): LOAD "@msg2" DATA y(): LET y1=y(1,1): LET y2=y(2,1): LET y3=y(3,1): LET y4=y(4,1): LET mbase=2: CLS : RETURN
2900 IF mbase=2 THEN SAVE "@7,mess2" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@:,msg2" DATA y(): LOAD "@mess1" DATA m$(): LOAD "@msg1" DATA y(): LET y1=y(1,1): LET y2=y(2,1): LET y3=y(3,1): LET y4=y(4,1): LET mbase=1: CLS : RETURN
2910 DATA "There are 2 message bases","1-General messages","2-Humor/Insults"," "
Farmers BBS
10 GO TO 900
20 OUT 119,34
30 OUT 119,0
50 IF INKEY$="NOT " THEN GO TO edit
60 IF IN 119=5 THEN GO TO 40
70 PAUSE 400
90 IF IN 119=5 THEN GO TO 40
100 PAUSE 400
120 IF IN 119=5 THEN GO TO 40
130 OUT 119,2
140 OUT 119,34
150 PAUSE 300
160 OUT 119,64: OUT 119,122: OUT 119,55
170 PAUSE 120: CLS : GO SUB 620: 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 720: LPRINT u$
180 LET y=0: REM set message number to read
190 RESTORE 200
200 DATA " Data Transfer MAIN MENU","<R>ead messages","<L>eave message","<I>nfo files","<T>ime on","<G>oodbye"," ","Choice?:"
210 RANDOMIZE USR output: OUT 115,13: PRINT
220 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
230 NEXT p
240 ON ERR GO TO 530: LET c$=CHR$ USR input: PRINT c$: PRINT
250 IF c$="r" OR c$="R" THEN FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: NEXT x: GO TO 300
260 IF c$="g" OR c$="G" THEN PAUSE 30: GO TO 530
270 IF c$="l" OR c$="L" THEN GO TO 430
280 IF c$="i" OR c$="I" THEN GO TO 1050
290 GO TO 190
300 LET y=y+1: IF y>20 THEN LET y=1
310 LET y=y+1: IF y>20 THEN LET y=1
320 IF m$(y,1)=" " THEN GO TO 300
330 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
340 FOR v=1 TO 1000: POKE 23692,255
350 IF CODE m$(y,v)=3 THEN LET v=1000: NEXT v: GO TO 190
360 PRINT m$(y,v);: RANDOMIZE USR output: OUT 115,CODE m$(y,v)
370 IF v>64 THEN NEXT v
380 IF (v>32 AND CODE m$(y,v)=13) THEN LET v=64: RANDOMIZE USR output: OUT 115,13
390 IF (v<32 AND CODE m$(y,v)=13) THEN LET v=32
400 NEXT v
410 RANDOMIZE USR output: OUT 115,13: PRINT
420 GO TO 190
430 LET y1=y1+1: IF y1>20 THEN LET y1=1
440 LET m$(y1)=""
450 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 530: LET m$(y1,1 TO 4)="TO: ": FOR x=5 TO 32: LET m$(y1,x)=CHR$ USR input: PRINT m$(y1,x);
460 IF CODE m$(y1,x)=13 THEN LET x=32
470 NEXT x
480 LET m$(y1,33 TO 38)="FROM: ": LET m$(y1,39 TO 64)=u$
490 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
500 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
510 ON ERR GO TO 530: FOR v=65 TO 1000: POKE 23692,255: LET m1=USR input: REM ctrl C=03h=ETX
520 LET m$(y1,v)=CHR$ m1: PRINT m$(y1,v);: IF m1=3 THEN LET v=1000: NEXT v: GO TO 190
530 ON ERR RESET
540 RANDOMIZE USR output: OUT 115,13
550 CLS : PAUSE 10
560 LET p$="Thank you for calling the DATA TRANSFER.... Hang up now!!!"
570 PAUSE 30: CLS : RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
580 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x
590 PAUSE 120
600 OUT 119,64: OUT 119,0: OUT 119,0
610 PAUSE 60: CLS : GO TO 20
620 PAUSE 30: FOR x=1 TO 30: RANDOMIZE USR output: OUT 115,0: NEXT x
630 IF IN 119<128 THEN GO TO 530
640 RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
650 RANDOMIZE USR output: OUT 115,28
660 FOR x=1 TO 10: RANDOMIZE USR output: OUT 115,13: PRINT : NEXT x
670 RESTORE 710
680 FOR z=1 TO 13: READ t$: LET t$=t$+CHR$ 13: FOR x=1 TO LEN t$: POKE 23692,255: PRINT t$(x);: RANDOMIZE USR output: OUT 115,CODE t$(x): NEXT x: NEXT z
690 FOR x=1 TO 5: RANDOMIZE USR output: OUT 115,13: PRINT : NEXT x
700 RETURN
710 DATA "+------------------------------+"," ","l Welcome To: l"," ","l DATA TRANSFER l"," ","l Online Daily 11:30pm-5:00pm l"," ","l Serving the Kentuckiana Area l"," ","l (812) 282-4023 l"," ","l 300 Baud 7/E/1 l","+------------------------------+"
720 DIM u$(32): LET u=1
730 RANDOMIZE USR output: OUT 115,5
740 ON ERR GO TO 530: LET v$=CHR$ USR input: PRINT v$;
750 LET u$(u)=v$ AND u<32: LET u=u+1
760 IF CODE v$=13 THEN RETURN
770 GO TO 740
780 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";AT 12,0;"<B>reak to BASIC"
790 LET i$=INKEY$
800 IF i$="" THEN GO TO 790
810 IF i$="s" OR i$="S" THEN GO TO 1450
820 IF i$="r" OR i$="R" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x: PRINT m$(x): PAUSE 0: GO TO edit
830 IF i$="d" OR i$="D" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x;" deleted.": LET m$(x)="": PAUSE 0: GO TO edit
840 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);
850 IF i$="l" OR i$="L" THEN IF CODE INKEY$=195 THEN LET m$(y1,x)=CHR$ 3: GO TO edit: REM 195=NOT
860 IF i$="l" OR i$="L" THEN NEXT x: PAUSE 0: GO TO edit
870 IF i$="q" OR i$="Q" THEN GO TO 530
880 IF i$="b" OR i$="B" THEN GO TO 1440
890 CLS : GO TO edit
900 PAPER 0: BORDER 0: INK 7: CLS
910 CLEAR 64999
920 DIM y(1,1): LET y1=0: 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)
930 PRINT : PRINT "<NOT> from most modes will exit to sysop control mode": PAUSE 180
940 LET y=0
950 LET input=65100: LET output=65200: LET quit=530: LET edit=780
960 PRINT "Now going to AUTOANSWER MODE": FOR x=1 TO 3: BEEP .1,10: NEXT x: PAUSE 180: CLS
980 RESTORE 990: FOR x=65000 TO 65008: READ x1: POKE x,x1: NEXT x
990 DATA 175,219,119,230,3,79,6,0,201
1000 RESTORE 1010: FOR x=input TO 65132: READ x1: POKE x,x1: NEXT x
1010 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
1020 RESTORE 1030: FOR x=output TO 65212: READ x1: POKE x,x1: NEXT x
1030 DATA 219,119,230,128,200,175,219,119,230,1,40,244,201
1040 GO TO 530
1050 RANDOMIZE USR output: OUT 115,13
1060 RESTORE 1070
1070 DATA "Information Section"," "," ","1-Info on this system","2-Address of Data Transfer"
1080 FOR x=1 TO 5: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
1090 RANDOMIZE USR output: OUT 115,13
1100 LET p$="Enter choice": PRINT p$: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
1110 ON ERR GO TO 530
1120 LET uu=USR input
1130 IF uu=0 THEN GO TO 1120
1140 IF CHR$ uu="1" OR CHR$ uu="2" THEN GO TO 1160
1150 RANDOMIZE USR output: OUT 115,13: GO TO 1100
1160 IF CHR$ uu="1" THEN RESTORE 1210
1170 IF CHR$ uu="2" THEN RESTORE 1320
1180 PRINT : RANDOMIZE USR output: OUT 115,13
1190 FOR x=1 TO 10: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
1200 GO TO 190
1210 DATA "DATA TRANSFER is run with TSTiny"
1220 DATA "-board on a Timex/Sinclair 2068 "
1230 DATA "(48k) computer with a Westridge "
1240 DATA "TS2050 modem (300 baud). TSTiny-"
1250 DATA "board is a Public Domain program"
1260 DATA " available on Compuserve or from"
1270 DATA " DATA TRANSFER. The program is "
1280 DATA "in BASIC and easily modified for"
1290 DATA " customization. Leave a message "
1300 DATA "or send a tape for a copy......."
1310 DATA " "
1320 DATA "--------------------------------"
1330 DATA "Our address-"
1340 DATA " DATA TRANSFER"
1350 DATA " C/O M. Farmer"
1360 DATA " 211 S.State St."
1370 DATA " Clarksville, IN"
1380 DATA " 47130"
1390 DATA "Please feel free to leave sugges"
1400 DATA "tions or send for a copy of TSTi"
1410 DATA "inyboard. Thanks......"
1420 DATA " "
1430 SAVE "tinyboard" LINE 900: REM T/S Tinyboard/Flashware * 1986 rev. date 01/21/86
1440 STOP
1450 SAVE "messbase" DATA m$(): LET y(1,1)=y1: SAVE "msgcntr" DATA y(): GO TO edit
Ralph BBS
0 REM CODE FLASH w NEW O<>CODE FLASH w NEW >=CODE FLASH w NEW ( POKE FLASH sO FLASH w NEW >=CODE FLASH w NEW ( POKE y OPEN #s<>CODE FLASH w NEW >=CODE FLASH w NEW ( POKE LINE !$!,T]USR ] OR *K\>) GO SUB LEN LPRINT >PEEK PLOT #>XPEEK LIST #>PEEK REM STR$ z GO SUB LEN LPRINT +s( RANDOMIZE <>> OPEN #w>" OPEN #w>@ OPEN #w>{ OPEN #w>7 OPEN #w<> * PEH SOFTWARE 1986
10 GO TO VAL "1860"
20 REM send a nl= NEW LINE
30 POKE 23692,255: PRINT : RANDOMIZE USR xmt: OUT 115,CODE l$: RETURN
40 REM PRINT TO caller
50 GO SUB nl: PRINT p$;: FOR x=SGN PI TO LEN p$: RANDOMIZE USR xmt: OUT 115,CODE p$(x): NEXT x: RETURN
60 REM BEEP
70 FOR x=9 TO 2 STEP -SGN PI: BEEP .2,15: NEXT x: RETURN
80 REM test FOR sysop access
90 IF IN mc<128 THEN GO TO VAL "1260"
100 IF INKEY$="c" OR INKEY$="C" THEN GO TO 900
110 IF INKEY$=" STEP " THEN GO TO 1570
120 GO TO ret
130 REM CLOSE # modem
140 GO SUB VAL "1810"
150 OUT mc,34: OUT mc,ed
160 REM test FOR IN call
170 GO SUB VAL "1300": PRINT AT 17,27;t$(2): LET ret=VAL "180": GO TO VAL "110"
180 IF IN mc=5 THEN GO TO 170
200 REM start/set on LINE time
210 RANDOMIZE USR 26826: PAUSE beep: ON ERR GO TO 1260: GO SUB beep: LET temp=hr*60+min
220 LET l$=CHR$ 13: RANDOMIZE USR 26781: LET p$="Hello"+l$+"Hello is this 2 lines Y/N": GO SUB sm
230 LET c$=CHR$ USR rcv: GO SUB nl: IF c$="y" OR c$="Y" THEN GO TO VAL "1030"
240 IF c$="n" OR c$="N" THEN LET l$=CHR$ 10: RANDOMIZE USR 26775: GO TO VAL "1030"
250 GO TO 230
260 REM menu
270 RESTORE VAL "1360": ON ERR GO TO VAL "1770": GO SUB cls: GO SUB 1170
280 LET p$="(B,C,G,L,Q,R,T,U)? ": GO SUB sm: LET c$=CHR$ USR rcv: PRINT c$: GO SUB nl
285 IF c$="b" OR c$="B" THEN GO TO 1040
290 IF c$="c" OR c$="C" THEN GO TO 900
300 IF c$="g" OR c$="G" THEN GO TO 1220
310 IF c$="l" OR c$="L" THEN GO TO 620
320 IF c$="q" OR c$="Q" THEN LET p$="use CONTROL C to Abort Scan.": GO SUB sm: GO TO VAL "850"
330 IF c$="r" OR c$="R" THEN GO SUB nl: GO TO 450
340 IF c$="t" OR c$="T" THEN GO SUB VAL "1300": GO SUB sm: GO TO VAL "280"
350 IF c$="u" OR c$="U" THEN GO TO VAL "1200"
360 GO TO VAL "280"
370 REM CLS SCREEN$ ,12=FF
380 CLS : OUT 115,12: RETURN
390 REM FORMAT & READ header
400 LET p1=32: LET p2=64: LET c$=m$(y, TO p2): FOR x=5 TO p2
410 IF c$(x)=l$ AND x<=32 THEN LET p1=x: LET x=39
420 IF c$(x)=l$ AND x<=64 THEN LET p2=x: LET x=64
430 NEXT x: LET p$="Message :"+STR$ y+" "+d$(y*14-13 TO y*14)+l$+c$( TO p1)+c$(33 TO p2): RETURN
440 REM READ msg
450 LET p$="Message 1 TO 40, Menu=0 >? ": GO SUB sm: LET c$=" ": ON ERR GO TO menu
460 FOR x=SGN x TO PI: LET c$(x)=CHR$ USR rcv: IF c$(2)=l$ OR c$(PI)=l$ THEN GO TO VAL "500"
480 IF (c$(x)<"0") OR (c$(x)>"9") THEN GO TO VAL "450"
490 NEXT x: IF LEN c$>2 THEN GO TO VAL "450"
500 GO SUB nl: LET y=VAL c$: IF NOT y THEN GO TO menu
510 IF y>=sm OR m$(y,1)=" " THEN GO TO VAL "1800"
520 GO SUB 390: LET p$=p$+m$(y,65 TO )
530 GO SUB cls: PRINT ''"Working": FOR x=SGN PI TO LEN p$: LET c=CODE p$(x): IF c=3 THEN GO TO VAL "560"
540 RANDOMIZE USR xmt: OUT 115,c
550 NEXT x: LET x=x-SGN PI
560 GO SUB nl: PRINT p$( TO x): LPRINT "Reas msg. "+STR$ y: GO TO VAL "450"
570 REM con= CONTINUE
580 GO SUB nl: LET p$="Press <ENTER> when ready": GO SUB sm
590 IF CHR$ USR rcv=l$ THEN GO TO ret
600 GO TO VAL "590"
610 REM leave message
620 GO SUB cls: LET p$="Is this message for Sysop Y/N>": GO SUB sm: LET c$=CHR$ USR rcv: IF c$="y" OR c$="Y" THEN GO TO VAL "1840"
630 GO SUB nl: FOR y=SGN PI TO VAL "40"
640 IF m$(y,1)<>" " THEN NEXT y: GO TO VAL "1780"
660 LET m$(y,LEN d$)=CHR$ PI: IF ed THEN GO TO VAL "1710"
670 LPRINT "Left msg. #";y
680 LET p$="Who gets Mess. "+STR$ y+"?": GO SUB sm: GO SUB nl: LET m$(y)="TO: ": FOR x=5 TO 31
690 LET m$(y,x)=CHR$ USR rcv: IF m$(y,x)=CHR$ 8 AND x>=SGN PI THEN LET x=x-2: NEXT x
700 IF m$(y,x)=l$ THEN GO TO VAL "720"
710 PRINT m$(y,x);: NEXT x: LET m$(y,x)=l$
720 LET m$(y,33 TO )="From: "+n$: LET p$="Input Message (534 chars max).. <CONTROL C> to save.": GO SUB sm: GO SUB nl
730 LET ret=VAL "780": FOR x=CODE "A" TO VAL "599"
740 LET c=USR rcv: IF c=8 AND x>=65 THEN LET x=x-1: GO TO VAL "740"
760 LET m$(y,x)=CHR$ c: PRINT m$(y,x);: IF c=3 THEN GO TO VAL "800"
770 GO TO 90
790 NEXT x
800 LET p3=x: LET p$="Message"+(" full and" AND x>=599)+" saved.": GO SUB sm: GO SUB VAL "825": IF ed THEN LET ed=p3: GO TO VAL "1850"
810 GO TO VAL "880"
820 REM FORMAT date/time
825 GO SUB VAL "1300"
830 LET d$(y*14-13 TO y*14)=p$: RETURN
840 REM Quick scan
850 LET ret=VAL "860": FOR y=SGN PI TO 40: IF m$(y,1)<>" " THEN GO SUB 390: GO SUB sm: IF NOT ed THEN GO TO 90
860 IF IN 115=3 THEN GO TO VAL "280"
870 NEXT y: IF ed THEN GO TO VAL "1750"
880 LET ret=menu: GO TO con
890 REM chat
900 LET p$="Paging sysop....": GO SUB sm
910 FOR x=SGN x TO VAL "144": IF INKEY$="" THEN PRINT ".";: RANDOMIZE USR xmt: OUT 115,46: BEEP .1,15: NEXT x: LET p$="Sorry, all we found were cobwebs": GO SUB sm: LPRINT "Tried caht": PAUSE CODE "c": GO TO menu
920 GO SUB cls: LET p$=n$+"entering chat mode": GO SUB sm: GO SUB nl: POKE VAL "23658",ed: PRINT "SYMBL SHIFT/ STEP TO LEAVE CHAT."
930 IF INKEY$=" STEP " THEN GO TO 1570
940 LET rcv1=ed: LET xmt1=ed
950 LET x=USR 26715: LET xmt1=x AND (x=1 OR x=3): LET rcv1=x AND (x=2 OR x=3)
960 IF rcv1 THEN LET c=USR rcv: PRINT CHR$ c;: IF c=CODE l$ THEN PRINT '">";
970 IF xmt1 AND INKEY$<>"" THEN GO TO 990
980 GO TO 930
990 IF xmt1 THEN LET c$=INKEY$: PRINT c$;: OUT 115,CODE c$: FOR x=NOT PI TO PI: NEXT x: IF c$=CHR$ 13 THEN RANDOMIZE USR xmt: OUT 115,62
1000 IF INKEY$<>"" THEN GO TO 1000
1010 GO TO 930
1020 REM send logon SCREEN$
1030 RESTORE VAL "1390": GO SUB cls: GO SUB VAL "1170": GO TO VAL "1070"
1040 REM send bulletin
1050 RESTORE VAL "1430": LPRINT " READ bulls": GO SUB cls: GO SUB VAL "1170": LET ret=1055: GO TO con
1055 GO SUB cls: GO SUB VAL "1170": LET ret=menu: GO TO con
1060 REM INPUT callers name
1070 GO SUB beep: LET p$="Who's calling?"+l$: GO SUB sm: LET n$=" ": RANDOMIZE USR xmt: OUT 115,5: FOR x=SGN x TO LEN n$
1080 LET c=USR rcv: IF c=8 AND x>=SGN PI THEN LET x=x-SGN PI: GO TO VAL "1080"
1105 IF c<>CODE l$ THEN LET n$(x)=CHR$ c: PRINT n$(x);: NEXT x
1120 LET n$=n$( TO x-SGN PI)+L$: IF LEN n$<5 THEN GO TO VAL "1070"
1130 LET p$=n$+"Correct (Y/N) >": GO SUB sm: LET c$=CHR$ USR rcv
1140 IF c$="n" OR c$="N" THEN GO TO VAL "1070"
1150 GO SUB nl: GO SUB 1300: LPRINT n$'p$( TO 14): GO TO VAL "2000"
1160 REM send SCREEN$ DATA
1170 READ y: LET ret=VAL "1180": FOR y=SGN PI TO y: READ p$: GO SUB sm: GO TO 90
1180 NEXT y: RETURN
1190 REM user LIST
1200 RESTORE VAL "1470": LPRINT " READ users LIST ": GO SUB cls: GO SUB VAL "1170": LET ret=menu: GO TO con
1210 REM quit BBS
1230 GO SUB cls: RESTORE VAL "1530": GO SUB VAL "1170"
1240 LET c$=CHR$ USR rcv: IF c$="n" OR c$="N" THEN GO TO menu
1250 READ p$: GO SUB sm: GO SUB VAL "1300": GO SUB sm: LPRINT p$'': OUT mc,64: OUT mc,NOT PI
1260 OUT mc,0: GO TO VAL "140"
1270 REM timer
1280 LET time=VAL "((PEEK 23672+256*PEEK 23673+65536*PEEK 23674)/3600)": LET hr=INT (time/60): LET min=INT (time-hr*60): IF hr>=24 THEN LET hr=NOT PI: LET dy=dy+SGN PI: GO SUB VAL "1950"
1290 RETURN
1300 GO SUB 1280: LET time=INT ((hr*60+min)-temp)
1310 LET p1=INT (time/60): LET p2=INT (time-(p1*60)): IF p1<0 THEN LET p1=p1+24
1320 LET c=SGN PI: GO SUB 1340: LET c=2: LET p1=hr: LET p2=min: GO SUB 1340
1330 LET p$=STR$ mo+"-"+STR$ dy+"-"+STR$ yr+";"+t$(2)+" Online "+t$(1)+l$: RETURN
1340 LET t$(c)=("0" AND LEN STR$ p1=SGN PI)+STR$ p1+":"+("0" AND LEN STR$ p2=SGN PI)+STR$ p2: RETURN
1350 REM menu DATA
1360 DATA 11," North Post Main Menu","","<B>ulletins","<C>hat","<G>oodby","<L>eave a Message"
1370 DATA "<Q>uick Scan messages","<R>ead message","<T>ime on","<U>sers list",""
1380 REM logon DATA
1390 DATA 14," North Post Message Post","-------------------------------","using an unexpanded Timex 2068","","Settings:","Duplex: Full Word Size: 7","Parity: Even Stop Bits: 1",""
1400 DATA "","Let us know what you think","about this BBs","","Open 24hrs a day, 7 days a week",""
1410 REM DATA ""
1420 REM bull DATA
1430 DATA 13,"Sysop: Ralph McCrum","Mad Programmer: Paul Holmgren","","**** >>> -Bullentin- <<< **** "
1435 DATA " Other Timex BBS","","ISTUG SISTER BBS Indianapolis,","Ind. 317-898-3903 same settings","24 hrs.","","A SASE to the Sysop gets you a","free sample I.S.T.U.G. news-","letter"
1440 DATA 14,"Keep May 2nd & 3rd open. The","Second TS Midwest Computer Fest","Will be in Indianapolis. Stay","tuned for future info","","The next I.S.T.U.G. meeting is","in Indianapolis at Paul","Holmgren's home. 1-24-87, 1:30","1-317-291-6002 for directions"
1445 DATA "","To contact the North Post Sysop","Write to:","P.O. Box 1161","Mishawaka, Ind. 46544"
1450 REM DATA ""
1460 REM user DATA
1470 DATA 7,"PAUL HOLMGREN","WILLIE JONES","FRANK DAVIS","PHILL MCCRUM"
1480 DATA "BUDDY KING","DAVE LEBOWITZ","DAVE BREHM"
1490 DATA ""
1500 DATA ""
1510 DATA "argh","Igor","","","","","","","","","","","","","","","","","","","","","","","","","": REM passwords
1520 REM quit DATA
1530 DATA 8,"","The Indiana Sinclair Timex","","Users Group hopes you enjoyed"
1540 DATA "","our little Bulletin Board.","","Are you ready to leave Y/N >","Goodby. Hanging up now"
1550 REM DATA ""
1560 REM edit
1570 ON ERR RESET
1580 LET p$="Commander Sysop taking control, Please Stand By": GO SUB sm
1590 CLS : PRINT "SYSOP EDITOR"''"C heck Time"'"D elete a msg."'"E stablish correct time"'"H ang up"'"L eave a msg."'"M ain Menu"'"Q uick Scan Msg. base"'"R ead Msg."'"S ave messages"''"(C,D,E,H,L,M,Q,R,S)"
1600 POKE VAL "23658",VAL "8": PAUSE ed: LET c$=INKEY$
1610 IF c$="C" THEN GO SUB VAL "1300": PRINT p$( TO 14): GO TO VAL "1750"
1620 IF c$="D" THEN INPUT "DELETE msg. #?: ";x: PRINT "Msg. # ";X;"deleted": LET m$(x)="": LET p$="": GO SUB 830: GO TO VAL "1750"
1630 IF c$="E" THEN GO SUB VAL "1940"
1640 IF c$="H" THEN GO TO VAL "1220"
1650 IF c$="L" THEN LET ed=nl: GO TO VAL "630"
1660 IF c$="M" THEN GO TO menu
1670 IF c$="Q" THEN LET ed=nl: GO TO VAL "840"
1680 IF c$="R" THEN INPUT " READ Msg. #? ";y: CLS : GO SUB 390: PRINT p$'m$(y,CODE "A" TO ): GO TO VAL "1750"
1690 IF c$="S" THEN LET m$(sm)=d$: SAVE "TSBBSmbase" DATA m$()
1700 GO TO VAL "1590"
1710 CLS : LET ed=NOT PI: INPUT " SYMBL SHIFT/ STEP TO STOP :"'"Msg. TO ? ";p$: LET m$(y)="To :"+p$+l$: LET m$(y,VAL "33" TO )="From : Sysop Willie"+l$: GO SUB VAL "825": GO SUB VAL "390": PRINT p$: LET p$=""
1720 INPUT LINE c$: IF c$=" STEP " THEN LET p$=p$+CHR$ PI: GO TO VAL "1740"
1730 LET p$=p$+c$+l$: PRINT c$: IF LEN p$<=VAL "535" THEN GO TO VAL "1720"
1740 LET m$(y,CODE "A" TO )=p$: PRINT
1750 LET ed=NOT PI: PRINT " NEXT ?": PAUSE ed: GO TO VAL "1590"
1760 REM error trapped messages
1770 ON ERR RESET : LET p$="Sorry "+n$+" A bug has Bit you.": GO SUB sm: GO SUB beep: GO TO menu: REM ?=control g=Beep
1780 IF ed THEN PRINT "I,m full, delete something first": GO TO VAL "1750"
1790 LET p$="Message base full right now."+l$+"Please try later": LPRINT '" I'm full. Do something. SOS"'': GO SUB sm: GO TO con
1800 LET ret=VAL "450": LET p$="Sorry no message "+STR$ y+". Try again": GO SUB sm: GO TO con
1810 REM idle SCREEN$
1820 CLS : PRINT AT VAL "7",VAL "7";"The I.S.T.U.G. BBS";AT VAL "10",VAL "6";"Scanning Phone LINE "'''''''" PEH SOFTWARE: 10-11-86": RETURN
1830 REM LPRINT sysop msg
1840 GO SUB cls: LET y=sm: LET m$(y)="": LET ed=y: GO TO VAL "720"
1850 LPRINT n$;m$(sm,65 TO ed): LET ed=NOT PI: GO TO menu
1860 REM init, 40 msg. base
1870 PAPER NOT PI: BORDER NOT PI: INK VAL "9": CLS
1880 PRINT '" STEP from most modes will GO TO SYSOP edit menu"
1890 LET rcv=VAL "26724": LET xmt=VAL "26759": DIM t$(2,5): LET temp=PI: LET mc=VAL "119"
1900 LET nl=VAL "30": LET sm=VAL "41": LET beep=VAL "70": LET menu=VAL "270": LET cls=VAL "380": LET con=VAL "580": LET l$=CHR$ 13: DIM m$(sm,VAL "600"): LET ed=NOT PI
1910 INPUT "Add a message base? ";p$: IF p$="y" OR p$="Y" THEN PRINT "Start Message Base Tape.": LOAD "" DATA m$()
1920 LET d$=m$(sm): GO TO VAL "1590"
1930 REM FORMAT & POKE clock
1940 INPUT "Month 1-12 ";mo,"Day 1-31 ";dy,"Hour 00-23 ";hr,"Minute ";min,"Year 86 ";yr
1950 LET x=VAL "(hr*3600+min*60)*60": LET y=INT (x/65536): POKE 23674,y
1960 LET p1=x-y*65536: LET x=INT (p1/256): POKE 23673,x: POKE 23672,p1-x*256: RETURN
1970 REM SAVE
1980 CLEAR : SAVE "bbs" LINE PI: GO TO VAL "1860"
1990 REM test USR name
2000 LET p$="Checking name": GO SUB sm
2010 LET C$=N$: FOR X=SGN PI TO LEN C$: IF C$(X)>="a" AND c$(x)<="z" THEN LET c$(x)=CHR$ (CODE (c$(x))-32)
2020 NEXT X
2030 RESTORE VAL "1470": READ y: FOR x=SGN PI TO y: READ p$: IF c$( TO LEN P$)=p$ THEN LET p1=x: GO TO VAL "2190"
2040 NEXT x
2050 REM get callers info
2060 RESTORE VAL "2070": GO SUB cls: GO SUB VAL "1170"
2070 DATA 14,"Answer the following questions.","","Access will be allowed after","we check on your information.","","The NORTH POST BBS is here to","serve the computer Hobbyist.","Leave messages, sale/want adds","etc. ** HOWEVER ** improper","behavior Will not be tolerated","","So feel free to call again, BUT","please keep it clean."," Thank You"
2080 DATA "Your Real Name","street address","city, state, zip","Phone # XXX-YYY-ZZZZ","Type/model of computer","Password ? 5 letters max"
2090 LET ret=VAL "2140": FOR c=SGN PI TO CODE "USR " STEP CODE " ": READ p$
2100 GO SUB sm: GO SUB nl: FOR y=c TO c+VAL "31": LET c$=CHR$ USR rcv: IF CODE c$=8 AND y>=c THEN LET y=y-2: NEXT y
2110 IF c$=l$ THEN GO TO VAL "2150"
2120 LET m$(sm,y)=c$: PRINT c$;
2130 GO TO 90
2140 NEXT y
2150 NEXT c
2160 LET p$=m$(sm, TO CODE "RND")+" Correct Y/N? >": GO SUB sm: LET c=USR rcv: IF c=CODE "n" OR c=CODE "N" THEN RESTORE VAL "2080": GO TO VAL "2090"
2170 LPRINT m$(sm, TO CODE "RND")
2180 RESTORE VAL "1530": READ y: FOR x=SGN PI TO y: GO TO VAL "1250"
2190 LET p$="Password? ": GO SUB sm: LET c$=" ": FOR x=SGN PI TO LEN c$: LET c=USR rcv: IF c=8 AND x>=SGN PI THEN LET x=x-2: NEXT x
2210 IF c<>CODE l$ THEN LET c$(x)=CHR$ c: NEXT x
2220 RESTORE VAL "1510": FOR x=SGN PI TO p1: READ p$: NEXT x: IF c$( TO LEN p$)=p$ THEN GO TO menu
2230 GO TO VAL "2180"
TS-BBS
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
1001 CLS
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 PRINT "Saving BASIC...": SAVE "tsbbs" LINE 10: PRINT "Saving MC...": SAVE "bbsmc"CODE 65000,2200
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$="Message # to read (1-50,0=EXIT):": GO SUB sm
3015 GO SUB getkey
3020 LET m=VAL r$
3022 IF m=0 THEN GO TO 3040
3025 IF m<1 OR m>50 THEN GO TO 3010
3030 GO TO 3060
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$(m): GO SUB sm
3085 GO SUB nl: GO SUB nl: LET p$="A=Another Q=Quit: ": GO SUB sm
3090 GO SUB getkey: LET c$=r$
3095 IF c$="A" OR c$="a" THEN GO SUB cls: GO TO 3030
3105 IF c$="Q" OR c$="q" THEN GO TO inputcom
3110 GO TO 3085
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 the 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
7203 IF INKEY$="c" THEN GO TO 7015
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 IF tu>50 THEN 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
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.





