+*#+=.
-=++==-:.:- :@@@@@@%-.
+@@@%##@@@@@@#. .******###+.
:-: #@@%###*:=*+*#%@@@@@@@@@@@@@@%#+=:.
*@@@%+ .@@@@#-=#@@@@@@@@@@@@@@@@@@@@*=--+@@#+-.
-@@@%#*: ..-#@@@@@@@@@@@@@@@@@@@@%-=**:-@@@= :@@%*:
+@@%%%+*. :=#@@@@@@@@@@@@@@@@%@@@@@+ *@@:=%@@@@#%*#+-**.
#@@@*=.*@@@@@@@@@@@@%#*****=***##@:=-@@.**@@@+:=#-#@=
#@##++@@@@@#####***#%%@@@@ =@%#%#+:#:#=**#%*=@#:@@#
#@*+:=+**#@@@@@@@@@@@@@@@%--#%++-.=@:-:+#####%%#**-+#
@#+=+=+=:*++++**#@@@@@@@@@@**==*@+=@#=. .=+*###*=.
=@*@* -@@@@@@@@*-+%@@@@@%+#@@#**#=+#@@%%#*+-:
:@@= .@@@@@#%*. ....=@@@@#+-
@= ...==. -#++++##
: =+-
Dartmouth DTSS TeleBASIC (c) 1964,1966,1969,1970,1971,1979,2023
TeleBASIC is the flavour of BASIC (Beginners' All-purpose Symbolic Instruction Code), used on Telehack. TeleBASIC is based on the original Dartmouth BASIC, but with a large number of additional features, such as support for regular expressions, UNIX timestamps, many common hashing/encoding algorithms, multi-dimensional arrays, and the ability to use alphanumeric indices.
Features from other types of BASIC such as HP2000 Access BASIC and Commodore BASIC have been added for increased compatibility and functionality.
TeleBASIC has a wide user-base and is actively maintained by members of The Telehack Foundation.
- Set Up Your Editor for BASIC Programming
- Comparing/Logical Operators
- Variables and Data Types
- Arrays & Hashes
- Command Overview
- FAQ
- ANSI Escape Sequences
There are currently four user-made plugins, which enable syntax-highlighting in various editors:
You can also use the text editor PED
within Telehack - a massively augmented version of the original program by Niek Albers. Extra features include syntax highlighting, and the ability to run programs without closing the editor.
These features are accessible via emacs-style meta-key shortcuts.
To see a list of features type M-x list-packages RET
.
The "M" refers to the "meta" key on your keyboard (most often, this is the escape key) and "RET" refers to the "return" key.
For example, to enable BASIC syntax highlighting, you would press escape, then x, then type "basic" and hit return.
Thus, the shorthand would be M-x basic RET
.
Additionally, you do not need to type the full name of the command. It is sufficient to simply type M-x ba RET
.
To run a BASIC program within PED
type M-x run RET
.
Command-line options
====================
ped /nomouse disables mouse input support
ped /noexpand disables tab expansion
ped /basic enables BASIC syntax highlighting
ped /tablen=<n> set tab length to <n>
-
=
(equal to)10 A% = 0 : IF A% = 0 THEN PRINT "It is equal!"
-
>
(greater than)10 A% = 5 : IF A% > 0 THEN PRINT "It is greater!"
-
>=
(greater than or equal to)10 A% = 0 : IF A% >= 0 THEN PRINT "It is greater or equal!"
-
<
(less than)10 A% = -1 : IF A% < 0 THEN PRINT "It is less!"
-
<=
(less than or equal to)10 A% = 0 : IF A% <= 0 THEN PRINT "It is less or equal!"
-
<>
(not equal to)10 A% = 1 : IF A% <> 0 THEN PRINT "It is not equal!"
-
AND
(bitwise "and" operation) -
OR
(bitwise "or" operation) -
XOR
(exclusive "or" operation) -
NOT
(negation) -
EQV
(material equivalence) -
IMP
(implication)
Operation | Value | Value | Result |
---|---|---|---|
NOT |
X |
NOT X |
|
NOT |
True | False | |
NOT |
False | True |
Operation | Value | Value | Result |
---|---|---|---|
AND |
X |
Y |
X AND Y |
AND |
True | True | True |
AND |
True | False | False |
AND |
False | True | False |
AND |
False | False | False |
Operation | Value | Value | Result |
---|---|---|---|
OR |
X |
Y |
X OR Y |
OR |
True | True | True |
OR |
True | False | True |
OR |
False | True | True |
OR |
False | False | False |
Operation | Value | Value | Result |
---|---|---|---|
XOR |
X |
Y |
X XOR Y |
XOR |
True | True | False |
XOR |
True | False | True |
XOR |
False | True | True |
XOR |
False | False | False |
Operation | Value | Value | Result |
---|---|---|---|
EQV |
X |
Y |
X EQV Y |
EQV |
True | True | True |
EQV |
True | False | False |
EQV |
False | True | False |
EQV |
False | False | True |
Operation | Value | Value | Result |
---|---|---|---|
IMP |
X |
Y |
X IMP Y |
IMP |
True | True | True |
IMP |
True | False | False |
IMP |
False | True | True |
IMP |
False | False | True |
TeleBASIC supports the following standard mathematical operators:
()
, ^
, **
, mod
, /
, *
, +
, and -
.
You can store either text or numeric values in variables.
Variable names can contain letters and digits, but they have to start with a letter (e.g FOO
, BAR123$
).
You cannot use reserved keywords (e.g FOR
, IF
) as variable names.
Variable names are most often suffixed with a type definition character (called a "sigil"):
$
represents a text (string) value%
represents a numeric (integer) value!
represents a numeric (single-precision) value
Strings MUST include the $
sigil. If a variable is missing a sigil, then it is a number.
For example:
10 NAME$ = "some name"
would represent a string variable NAME$
, but
10 NAME = "some name"
...would throw a TYPE MISMATCH ERROR
, since you cannot assign a string to a numeric variable.
An array variable is basically a list of values. These can be accessed by specifying an index number. In traditional Dartmouth BASIC, we define a string array of size 10:
10 DIM MYLIST$(10)
Now we can modify the 5th Entry (note that the array index usually starts at 0, and can also be negative):
20 MYLIST$(4) = "some text"
TeleBASIC, however, does not require you to define the array's size before accessing it, so DIM
is not necessary.
In addition to this, TeleBASIC allows for creation of multi-dimensional arrays, such as:
10 MYSTUFF( X, Y ) = 42
... and indices do not need to be numeric. Thus, you can create unordered lists (hashes) such as:
10 FAV$("fruit") = "Apple"
20 FAV$("vehicle") = "Bicycle"
30 FAV$("language") = "TeleBASIC"
ACCESS
Currently not implemented, does nothingARG$
A string containing all command line argumentsARGC%
The number of arguments passed to the programARGV$(n)
An array containing all of the arguments passed to the programASC(s$)
Returns the ASCII value of the first character in the strings$
ATN(n)
Returns the arctangent of the specified valuen
BIN$(n)
Returns the binary representation of the integern
as a stringBRK(n)
Currently not implemented, does nothing
CALL
Currently not implemented, does nothingCHR$(n)
Convert an ASCII coden
to its equivalent characterCINT(n)
Returns the nearest integer of the specified valueCIRCLE
Currently not implemented, does nothingCOLOR(a, b)
Changes the colours of the terminalCOS(n)
Returns the cosinus of a specified valuen
in radiansCSNG(n)
Convert a specified valuen
to a single precision number
D2R(n)
Convert degrees to radiansDATA n...
Store variables accessed by the programREAD
statementsDEF FNname(Argument) = Expression
Define a functionDEFDBL (Variable)
Currently not implemented, does nothingDEFINT (Variable)
Currently not implemented, does nothingDEFSNG (Variable)
Currently not implemented, does nothingDEFSTR (Variable)
Currently not implemented, does nothingDIM (Variable)
Currently not implemented, does nothingDIR$
Returns the filenames in your local directory, separated by spacesDO
Currently not implemented, does nothingDRAW
Currently not implemented, does nothing
END
End program execution silently, without additional outputEOF(n)
Returns file pointer informationERASE (arrays)
To eliminate arrays from a programEXP(n)
Return base of natural logarithms to the power ofn
FOR x = startValue TO maxValue [STEP n]
Execute a series of instructionsFRE
Return available memory
GOSUB (LineNumber)
Branch to a subroutine and returnGOTO (LineNumber)
Branch unconditionally to a specified line number
IF expression THEN statements
Make a decision regarding program flowINKEY$
Returns one character read from the terminalINPUT FileNo, var$
Reads a line from an open fileINPUT var$
Read user inputINPUT "prompt", var$
Read user inputINPUT varA$, varB$, ...
Read user inputINPUT "prompt", varA$, varB$, ...
Read user inputINSTR(string$, search$, startPos)
Returns the position of a substringINT (n)
Truncate a value to a whole numberITM(fileNumber)
Returns the number of a data item
LEFT$(s$, n)
Returns the leftmostn
characters of the specified strings$
LEN(s$)
Returns the number of characters in the specified stringLET Variable = Value
Assigns a value to a variableLIN(n)
Returnsn
newlinesLOCATE y, x
Change the cursor position toy
,x
LOG(n)
Returns the natural logarithm ofn
LOG10(n)
Returns the natural logarithm ofn
(base 10)
MID$(s$, n, [l])
Returns a string ofl
characters froms$
NINT(n)
Returns the nearest integer of the specified valueNUM(s$)
Returns the ASCII value of the first character in the strings$
OCT$(n)
Returns the octal value ofn
ON NUMBER%
Jump conditionally to a line number based on value givenOPEN filename$, AS fileNumber
Opens a file
PCLEAR0
Currently not implemented, does nothingPCLEAR1
Currently not implemented, does nothingPEEK(n)
Read a value from the specified memory locationn
PLAY
Currently not implemented, does nothingPMODE0
Currently not implemented, does nothingPOKE n, m
Write a byte of datam
into the specified memory locationn
POLKEY$(n)
Returns one character read from the terminalPORT%
Returns the port from the currently logged in userPOS(s1$,s2$)
Returns the position of a substringPRINT expression
Prints an expression to the screenPUT
Currently not implemented, does nothing
R2D(n)
Convertsn
radians to degreesREAD n...
or a file and assign to variableREC(n)
in the specified fileRENUMBER [start,[inc]
Renumbers the statements of the current programRESTORE
statements to be rereadRETURN
Return from a subroutineRIGHT$(s$, n)
Returns the rightmostn
characters ofs$
RND(n)
Returns a random number
SCRATCH
Delete a file from the diskSCREEN
Currently not implemented, does nothingSGN(n)
Returns the sign of the specified valuen
SIN(n)
Returns the trigonometric sine of the specified valuen
in radiansSLEEP n
Pauses the program forn
secondsSOUND
Currently not implemented, does nothingSOUNDRND
Currently not implemented, does nothingSPACE$(n)
,SPC$(n)
,SPA(n)
Returnsn
spacesSQR(n)
Returns the square root ofn
STOP
Halts the program and prints the current lineSTR$(n)
Returnsn
as a string valueSTRING$(n, s$)
Repeats the strings$
n
timesSYSTEM
End program execution silently, without additional output
TAB(n), TAB$(n)
Returnsn
spaces (not tabs!)TAN(n)
Returns trigonometric tangent ofn
in radiansTH_B64D$
Returns argument decoded from base64TH_B64E$
Returns argument encoded to base64TH_DEFGROUP$
Returns the user's defgroup, separated by spacesTH_EXEC
Executes a shell command and returns to the programTH_GMTIME[$]
Returns a human-readable UTC time for a timestampTH_HASADMIN(sat$)
Returns 1 if the user has admin onsat$
TH_HASBADGE(badge$)
Returns when the user earnedbadge$
TH_HASLOGIN(host$)
Returns 1 if the user has login onhost$
TH_HASROOT(host$)
Returns 1 if the user has root onhost$
TH_HASSYSOP(bbs$)
Returns 1 if the user has sysop onbbs$
TH_HOSTNAME$
Returns current hostname or hostname of argument passedTH_LOCALTIME[$]
Returns a human-readable local time for a timestampTH_MD5BASE64$
Returns md5 hex of argument passed as base64TH_MD5HEX$
Returns md5 hex of argument passed as hexTH_MODEM$
Returns modem information depending on option passedTH_NETSTAT$
Returns a netstat, separated by spacesTH_PLAN$
Returns the user's.plan
as a stringTH_RE(txt$,pat$,count,case)
Returns regex matchesTH_RE$(txt$,pat$,ind$,case)
Returns regex matchesTH_REV$(s$)
Returns the strings$
in reverse orderTH_SED$(txt$,find$,replace$,opt$)
Substitute matched substringTH_SPRINTF$(fmt$,[...])
Returns a formatted stringTH_SYSLEVEL
Returns the user's Telehack system levelTH_TIME
Returns the current UNIX timestampTH_UUD$(s$)
Decodes a uuencoded stringTH_UUE$(s$)
Returns uuencoded form of input stringTIM(n)
Returns values of time and date depending onn
TIME$
Returns the local system timeTIMER
Returns the number of seconds since midnightTROFF
Stops tracing of program statementsTRON
Starts tracing of program statementsTYP(n)
Returns the type of the next record in a file
UPS$(string)
Returns the uppercase value of the given stringUSER$
Returns the current logged in user
VAL(s$)
Returns the numeric value ofs$
WIDTH
Returns your terminal width
Returns the absolute value of the specified value n
10 PRINT ABS(-40)
40
Currently not implemented, does nothing
A string variable this is populated with a string containing the command line arguments when a BASIC program is run from the shell command prompt.
10 PRINT ARG$
@program foo bar
foo bar
An array containing all of the arguments passed to the program (see example for ARGC%
below)
The number of arguments passed to the program
10 FOR I = 0 TO ARGC%-1
20 PRINT ARGV$(I)
30 NEXT I
@program foo "hello world" bar
[run program.bas foo "hello world" bar]
program.bas
foo
hello world
bar
Returns the ASCII value of the first character in the string s$
10 PRINT ASC("A")
65
See also NUM
Returns the arctangent of the specified value n
10 PRINT ATN(40)
1.546
Returns the binary representation of the integer n
as a string
10 PRINT BIN$(123)
1111011
Currently not implemented, does nothing
Currently not implemented, does nothing
Convert an ASCII code n
to its equivalent character
10 PRINT CHR$(42)
*
Returns the nearest integer of the specified value (9.5 becomes 10)
10 PRINT CINT(5.7)
6
Currently not implemented, does nothing
Changes the background b
and/or foreground a
colour of the terminal
10 COLOR 3, 4
20 PRINT "Hello"
Prints Hello
with blue b
background and yellow a
foreground text. A list of possible colours can be found with the command SHOW COLORS
.
Returns the cosinus of a specified value n
in radians
10 PRINT COS(67)
-0.517769799789505
Convert a specified value n
to a single precision number
10 PRINT CSNG("3.45")
3.450
Convert degrees to radians
10 PRINT D2R( 90 )
1.571
Store the numeric and string constants that are accessed by the program READ
statements
10 DATA 4.1, 5.6, 9.98
20 READ A, B, C
30 PRINT A, B, C
4.100 5.600 9.980
Define a function with the name FNname
which accepts an Argument
and returns the defined Expression
.
The function name must always begin with FN
, followed by an optional space.
10 DEF FN square(x) = x^2
20 DEF FNcube(x) = x^3
30 DEF FNtood$(s$) = s$ + "tood"
40 PRINT FNsquare(5),FNcube(5),FNtood$("foo")
25 125 footood
Declare a variable as double precision number (currently not implemented, does nothing)
Declare a variable as integer number (currently not implemented, does nothing)
Declare a variable as single precision number (currently not implemented, does nothing)
Declare a variable as string (currently not implemented, does nothing)
Define an array of a fixed size (currently not implemented, does nothing)
Returns the filenames in your local directory, separated by spaces
10 PRINT DIR$
advent.gam againstip.txt basic15.a2 bbslist.txt c8test.c8 changelog.txt colossus.txt command.txt crackdown.txt do-well.txt etewaf.txt finger.txt fireworks.vt fnord.txt future.txt hammurabi.bas hckr_hnd.txt ien137.txt jfet.a2 johnnycode.txt k-rad.txt learncode.txt leaves.txt lem.bas lostpig.gam mastermind.bas notes.txt orange-book.txt oregon.bas porthack.exe privacy.txt rogue.gam rootkit.exe satcom.man smile.c8 starwars.txt sysmon.txt telehack.txt ttest.vt underground.txt unix.txt valentin.vt wardial.exe wumpus.bas xmodem.exe zork.gam
Currently not implemented, does nothing
Currently not implemented, does nothing
End execution of the program silently, without additional output (in contrast to STOP
).
Note that SYSTEM
is an alias for END
.
10 PRINT "hello"
20 GOSUB 100
30 END
40 PRINT "WORLD"
50 RETURN
Returns -1 if the file pointer in file number n
is currently at the end of the document, otherwise returns 0.
The reason for -1 being used to denote truth is that -1 is 11111111 in binary, and conversely, 0 is 00000000.
See also TYP
.
Eliminate an array from the program. Accepts a list of arrays.
10 A(1) = 123
20 A(2) = 456
30 B$( "foo" ) = "bar"
40 B$( "bar" ) = "baz"
50 ERASE A, B$
60 PRINT A(1) A(2) "'" B$( "foo" ) "' '" B$( "bar" ) "'"
0 0 '' ''
Return the base of natural logarithms to the power of the specified value n
10 PRINT EXP(13)
442413.392
Execute a series of instructions a specified number of times in a loop, optionally incrementing x
by n
each time.
Note that FOR I=A TO B STEP S: ... : NEXT I
works like I=A; do { ... } while ((I+=S) < B);
(in the C programming language), so the last NEXT I
increases I
one step beyond B
.
10 FOR I = 1 TO 40
20 PRINT I
30 NEXT I
40 REM the I variable is now 41
This would run 40 times and output every time the current counter, incrementing I
by 1 each time.
10 FOR I = 1 TO 40 STEP 2
20 PRINT I
30 NEXT I
This would run 40 times and output the current counter in each iteration, and would increase I
by 2 each time.
10 FOR I = 1 TO 0 STEP 0
20 PRINT I
30 NEXT I
This would create an endless loop, printing 1
over and over until terminated.
Return the available system memory in bytes
10 PRINT FRE
1048576
Branch to a subroutine and return
10 GOSUB 100
20 PRINT "Now I'm back from the subroutine"
30 END
100 REM Subroutine starts here
110 PRINT "I am now in the subroutine"
120 RETURN
I am now in the subroutine
Now I'm back from the subroutine
Branch unconditionally out of the normal program sequence to a specified line number
10 PRINT "Hello World!"
20 GOTO 10
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
[...]
You might want to use a SLEEP
statement here!
Returns your terminal height
Returns a string which represents the hexadecimal value of the specified number n
10 PRINT HEX$(127)
7F
Make a decision regarding program flow based on the result of a returned expression
10 K = 3
20 J = 10
30 IF J > K THEN PRINT "J is bigger than K"
J is bigger than K
See section 2. Comparing/Logical Operators
Returns one character read from the terminal. It will wait until a character is typed. For a non-blocking alternative, see POLKEY$
10 A$ = INKEY$
20 PRINT A$
Shows the default prompt and reads input from the user and saves it into var$
.
10 INPUT A$
20 PRINT A$
Shows prompt$
and reads input from the user and saves it into var$
. Note that the prompt must be a string literal, not a variable.
10 INPUT "Enter something>", A$
20 PRINT A$
Shows the default prompt and reads input from the user, splits it at commas, and saves it into varA$
, varB$
, ...
10 INPUT A$, B$, C$
20 PRINT A$, B$, C$
Shows prompt$
and reads input from the user, splits it at commas, and saves it into varA$
, varB$
, ... Note that the prompt must be a string literal, not a variable.
10 INPUT "Enter something>", A$, B$, C$
20 PRINT A$, B$, C$
Reads a line from an open file and saves it into var$
10 INPUT# 1, A
20 PRINT A
Returns the position (starting with 0) of a substring within a string
10 TEXT$ = "Hello World"
20 SEARCHFOR$ = "W"
30 PRINT INSTR(TEXT$, SEARCHFOR$, 0)
6
Truncate a value to a whole number
10 PRINT INT(5.6)
5
Returns the number of the data item currently pointed to in the current record of file fileNumber
.
In TeleBASIC this will almost always be 1.
10 PRINT #1;A,B,C
20 READ #1,1;A
30 PRINT REC(1),ITM(1)
1 2
Returns the leftmost n
characters of the specified string s$
10 A$ = "Hello World"
20 B$ = LEFT$(A$, 5)
30 PRINT B$
Hello
Returns the number of characters in the specified string
10 A$ = "Hello World"
20 PRINT LEN(A$)
11
Assigns a value to a variable. Traditionally this is for use with constants, which are not supported in TeleBASIC, and so LET
is superfluous.
10 LET A = 12345
20 PRINT A
12345
Returns n
newlines
10 PRINT "A" LIN(2) "B"
A
B
Change the cursor position to y
, x
10 LOCATE 5, 5
Returns the natural logarithm of n
using Euler's Number as the base
10 PRINT LOG(6)
1.792
Returns the natural logarithm of n
using 10 as the base (decimal).
10 PRINT LOG10(6)
0.778
Returns a string of l
characters from s$
beginning with the n
th character
10 A$ = "Hello World"
20 PRINT MID$(A$,3,3)
llo
Returns the nearest integer of the specified value (9.5 becomes 9)
10 PRINT NINT(5.6)
6
Returns the ASCII value of the first character in the string s$
10 PRINT NUM("A")
65
See also ASC
Returns the octal value of n
10 PRINT OCT$(66)
102
Opens a file
10 OPEN "filename.txt", AS #1
Jump conditionally with GOTO
/GOSUB
, based on value given
10 NUMBER% = 2
20 ON NUMBER% GOTO 100,200,300
100 PRINT "Goto 100, will NOT jump here" : END
200 PRINT "Goto 200, will jump here" : END
300 PRINT "Goto 300, will NOT jump here" : END
Goto 200, will jump here
Currently not implemented, does nothing
Currently not implemented, does nothing
Read a value from the specified memory location n
10 PRINT PEEK(1300)
83
Currently not implemented, does nothing
Currently not implemented, does nothing
Write a byte of data m
into the specified memory location n
10 POKE 1300, 255
Returns one character read from the terminal. When no key is hit within n
seconds, it returns the empty string
10 A$ = POLKEY$(5)
20 REM This will wait 5 seconds, waiting for user input
30 PRINT A$
Returns the port from the currently logged in user. Not to be confused with the current socket (e.g 23 for telnet)
10 PRINT USER$ + " is logged in on port: " + STR$(PORT%)
Returns the position of s2$
in s1$
indexed from 1, or 0 if not found
10 A$="ABCDE"
20 PRINT POS(A$,"CD")
3
Prints an expression to the screen
10 A = 5
20 B = 10
30 PRINT A + B
15
10 A$ = "Hello "
20 B$ = "World"
30 PRINT A$;
40 PRINT B$
50 PRINT A$ + B$
60 PRINT A$ B$
Hello World
Hello World
Hello World
&
and ?
are available aliases for PRINT
Adding a ;
at the end of PRINT
will suppress the newline
Prints a expression into an open file, with optional record (line) number
10 OPEN "myfile.txt", AS #1
20 PRINT# 1, "Hello world"
30 CLOSE #1
Prints an EOF mark to a file, truncating the file at that record
10 PRINT #1;A$
20 PRINT #1,1;"Overwriting A$ in record 1"
30 PRINT #1,1;END : REM Truncates file at record 1
Observe the placement of the #
in PRINT
, AS
, and CLOSE
statements in the above examples
Currently not implemented, does nothing
Converts n
radians to degrees
10 PRINT R2D(1.2)
68.755
Read a value from DATA
or a file and assign them to variables
10 DATA 4.1, 5.6, 9.98
20 READ A, B, C
30 PRINT A, B, C
4.100 5.600 9.980
Read a value from DATA
or a file and assign them to variables
10 READ #1;A$
20 READ #1,4;B$
Returns the current record number (line number) in the specified file. Starts at 1
10 OPEN "telehack.txt", AS #1
20 INPUT# 1, DUMP$
30 INPUT# 1, DUMP$
40 INPUT# 1, DUMP$
50 PRINT REC(1)
60 CLOSE #1
3
Renumbers the statements of the current program in memory. When optional parameters are not specified, number starts at 10 and increments by 10 for each line. Can be abbrieviated to REN
or RENUM
. Useful if you want to add more lines between existing statements
>1 GOTO 2
>2 END
>REN
>LIST
10 GOTO 20
20 END
Allow DATA
statements to be reread
10 DATA 4.1, 5.6, 9.98
20 READ A, B, C
30 PRINT A, B, C
40 RESTORE
50 READ A, B, C
60 PRINT A, B, C
4.100 5.600 9.980
4.100 5.600 9.980
Return from a subroutine, for use with GOSUB
.
10 GOSUB 30
20 END
30 PRINT "Hello"
40 RETURN
Hello
Returns the rightmost n
characters of the specified string s$
10 A$ = "Hello World"
20 PRINT RIGHT$(A$, 5)
World
If n < 0
, returns a random number in the interval [0, 1]
seeded by n
If n = 0
, returns a random number in the interval [0, 1]
If n > 0
, returns a random number in the interval [0, n]
10 PRINT RND(-5)
20 PRINT RND(0)
30 PRINT RND(5)
0.249
0.912
2.376
Delete a file from the disk
10 SCRATCH "FOOBAR.TXT"
ARE YOU SURE? Y/n y
FOOBAR.TXT removed.
Any input that is not Y
(case insensitive) will cancel the operation.
Runs silently when run with variable assignment, i.e will not prompt for confirmation
10 PRINT "HELLO"
20 SCRATCH "FOOBAR.TXT" ; FOO$
30 PRINT "WORLD"
HELLO
WORLD
Currently not implemented, does nothing
Returns the sign of the specified value n
10 PRINT SGN(5)
20 PRINT SGN(0)
30 PRINT SGN(-7)
1
0
-1
Returns the trigonometric sine of the specified value n
in radians
10 PRINT SIN(36)
-0.991778853443116
Pauses the program for n
seconds
10 SLEEP 5
Currently not implemented, does nothing
Currently not implemented, does nothing
Returns n
spaces
10 PRINT "ABC" SPACE$(10) "ABC"
abc abc
Returns the square root of n
10 PRINT SQR(36)
6
Halts the program and prints the current line. Useful for debugging programs
Returns n
as a string value
10 PRINT STR$(12345)
12345
Repeats the string s$
n
times
10 PRINT STRING$(10, "A")
AAAAAAAAAA
Returns n
spaces (not tabs!)
10 PRINT "ABC" TAB$(10) "ABC"
abc abc
Returns the trigonometric tangent of the specified value n
in radians
10 PRINT TAN(38)
0.310
Returns the user's Telehack system level. Optionally takes a username as argument.
10 PRINT TH_SYSLEVEL
20 PRINT TH_SYSLEVEL("quantx")
12
81
The user executing the above code would evidently have 12 badges.
Returns a UNIX timestamp of when the user earned badge$
, or 0
10 PRINT TH_HASBADGE("ACCT")
1559673339
10 PRINT TH_HASBADGE("ACCT", "doesntexist")
0
Returns 1 if the user has login on host$
, otherwise 0
10 PRINT TH_HASLOGIN("mimsy")
1
10 PRINT TH_HASLOGIN("ames")
0
Returns 1 if the user has root on host$
, otherwise 0
10 PRINT TH_HASROOT("mimsy")
1
10 PRINT TH_HASROOT("ames")
0
Returns 1 if the user has sysop on bbs$
, otherwise 0
10 PRINT TH_HASSYSOP("maccavern")
1
10 PRINT TH_HASSYSOP("illuminati")
0
Returns 1 if the user has admin on sat$
, otherwise 0
10 PRINT TH_HASADMIN("sat_BT 5")
1
Returns the user's defgroup, separated by spaces
10 PRINT TH_DEFGROUP$
archer lorelei
Returns the user's .plan
as a string
10 PRINT TH_PLAN$
To write a BASIC program
<3
Returns the current UNIX timestamp
10 PRINT TH_TIME
1675018633.67413
Returns a human-readable local time for the given UNIX timestamp.
10 PRINT TH_LOCALTIME$(TH_TIME)
Wednesday, December 9, 2020 6:40:49 PM PST
Returns values of time and date if options are supplied, and no sigil:
0
-sec
1
-min
2
-hour
3
-mday
4
-mon
5
-year
6
-wday
7
-yday
8
-isdst
10 FOR I = 0 TO 8 : PRINT TH_LOCALTIME(I,0) : NEXT I
0
0
16
31
11
69
3
364
0
Returns a human-readable UTC time for the given UNIX timestamp with the same options as TH_LOCALTIME[$]
Returns modem information depending on option passed:
0
number1
filename2
hostname3
description4
baud rate5
administrator6
location
Returns current hostname or hostname of argument passed. Supports OSPROBER
plugin.
10 PRINT TH_HOSTNAME$
telehack
Returns current netstat, or netstat of hostname passed as argument, separated by spaces
adaptex cotds mimsy oddjob oracle tandem veritas
Returns md5 hex of argument passed as hex
10 PRINT TH_MD5HEX$("FOO")
901890a8e9c8cf6d5a1a542b229febff
Returns md5 hex of argument passed as base64
10 PRINT TH_MD5BASE64$("FOO")
kBiQqOnIz21aGlQrIp/r/w
Returns argument encoded to base64
10 PRINT TH_B64E$("Telehack")
VGVsZWhhY2s=
Returns argument decoded from base64
10 PRINT TH_B64D$("VGVsZWhhY2s=")
Telehack
Executes a shell command and returns to the current BASIC program
10 TH_EXEC "echo foo" : TH_EXEC "echo bar"
foo
bar
10 TH_EXEC "fnord", OUT$ : PRINT OUT$
The iguana from Austin will go to Austin.
Note: variables assigned with TH_EXEC
will have trailing CRLF
characters, much like back-ticks in bash scripts.
Number context, returns a boolean (1 or 0) depending on regex match
10 IF TH_RE( "hello", "l{2}" ) THEN PRINT "it matches"
it matches
If countmode is true, returns number of matches:
10 PRINT TH_RE( "HELLO", "L", 1 )
2
String context, returns single captured group of match
10 PRINT TH_RE$( "hello world", "he\w+" )
hello
If an index n
is provided, the string returned will be the n
th captured group:
10 PRINT TH_RE$( "FOO BAR BAZ BINGO BANGO", "BA...", 2 )
BANGO
In the above example, the match returned is not "BAZ B", since the "B" in "BAZ" has already been consumed by the first match.
If the index supplied is 0, it will return the final match. If no index is supplied, it will return the first match.
Returns the string s$
in reverse order
10 PRINT TH_REV$( "deliver" )
reviled
Stream editor, replaces matched substring with substitution
Available options:
- "i" = case insensitive
- "g" = global mode
10 PRINT TH_SED$( "foo bAR", "oo|ar", "izz", "gi" )
fizz bizz
Returns a formatted string based on given parameters:
%%
- A percent sign%c
- A character with the given decimal number%s
- A string of characters%S
- A string of characters, left aligned%d
- A signed integer, in decimal%b
- An unsigned integer, in binary%u
- An unsigned integer, in decimal%o
- An unsigned integer, in octal%x
- An unsigned integer, in hexadecimal%a
- Hexadecimal floating point%n
- Interprets width as positional index (see example 2)%r
- Returns a random value from the list as a string%e
- A floating-point number, in scientific notation%f
- A floating-point number, in fixed decimal notation%g
- A floating-point number, in%e
or%f
notation%h
- A floating-point number, in IEEE-754 notation%i
- Exactly like%d
, for compatibility, or something%y
- Returns the decimal form of a hexadecimal unsigned int value%z
- Returns decimal form of IEEE-754 input value%D
- Like%d
, but longer%U
- Like%u
, but longer%O
- Like%o
, but longer%F
- Like%f
, but longer%B
- Like%b
, but LOUDER%R
- Like%r
, but left-aligned%X
- Like%x
, but using upper-case letters%E
- Like%e
, but using an upper-case "E"%G
- Like%g
, but with an upper-case "E" (if applicable)%H
- Like%h
, but using upper-case letters%A
- Like%a
, but using upper-case letters
10 F$ = "%s likes to %s while %sing"
20 PRINT TH_SPRINTF$( F$, "Sam", "sing", "cook" )
30 PRINT TH_SPRINTF$( F$, "Izumi", "read", "relax" )
40 PRINT TH_SPRINTF$( F$, "Wumpus", "tood", "tood" )
Sam likes to sing while cooking
Izumi likes to read while relaxing
Wumpus likes to tood while tooding
10 PRINT TH_SPRINTF$( "%2n%1n%1n", "na", "Ba" )
Banana
10 PRINT TH_SPRINTF$("%42R...YOU LOSE","HEADS","TAILS")
TAILS ...YOU LOSE
10 F$ = "I got %08b problems but leading zeros ain't %08b."
20 PRINT TH_SPRINTF$( F$, 99, 1 )
I got 01100011 problems but leading zeros ain't 00000001.
10 DATA "Name", "Car", "Country"
20 DATA "----", "---", "-------"
30 DATA "Bill", "Volvo", "New Zealand"
40 DATA "Alex", "Ferrari", "Italy"
50 DATA "Wumpus", "Tesla", "United States"
60 FOR I = 1 TO 5
70 READ A$, B$, C$
80 PRINT TH_SPRINTF$("%10S%12S%12S", A$, B$, C$)
90 NEXT I
Name Car Country
---- --- -------
Bill Volvo New Zealand
Alex Ferrari Italy
Wumpus Tesla United States
Decodes a uuencoded string
10 PRINT TH_UUD$("#9F]O")
foo
Returns uuencoded form of input string
10 PRINT TH_UUE$("foo")
#9F]O
Returns values of time and date depending on n
0
- Current minute (0-59)1
- Current hour (0-23)2
- Current day (1-366)3
- Current year (0-99)4
- Current second (0-59)
10 PRINT TIM(0)
29
Returns the local system time
10 PRINT TIME$
07:49:38
Returns the number of seconds since midnight
10 PRINT TIMER
28210
Returns the type of the next record in a file
Return values:
1
- Numeric data (not currently working)2
- String data3
- End of file
10 REM CREATE A FILE FOR TESTING
20 FILENAME$ = "TEST" + STR$(INT(RND(1)*128*2)) + ".TXT"
30 OPEN FILENAME$, AS #1
40 REM POPULATE FILE WITH TEST DATA
50 PRINT# 1, "some text"
60 REM SAVE FILE
70 CLOSE #1
80 REM TEST TYP() COMMAND
90 OPEN FILENAME$, AS #1
100 PRINT TYP(1)
110 REM ADVANCE ONE RECORD
120 INPUT# 1, DUMP$
130 PRINT TYP(1)
140 CLOSE #1
2
3
See also EOF
.
Stops tracing of program statements. Useful for debugging
Starts tracing of program statements. Useful for debugging
Returns the uppercase value of the given string
10 PRINT UPS$("hello")
HELLO
Returns the current logged in user
10 PRINT USER$
archer
Returns the numeric value of s$
10 PRINT VAL("12345")
12345
Returns your terminal width
A: Create the function with:
DEF FNNAND( A, B ) = NOT ( A AND B )
Now you can call it with:
10 PRINT FNNAND( 0, 0 )
1
A: Like this:
10 OPEN "filename.txt", AS #1
20 IF EOF(1) THEN GOTO 60
30 INPUT# 1, A$
40 PRINT A$
50 GOTO 20
60 CLOSE #1
A: Like this:
10 OPEN "filename.txt", AS #1
20 PRINT# 1, "Hello World!"
30 CLOSE #1
A: You have to open the file and put the file-pointer at the end of file, like this:
10 OPEN "filename.txt", AS #1
20 IF EOF(1) THEN GOTO 50
30 INPUT# 1, DUMP$
40 GOTO 20
50 PRINT# 1, "We are now at the EOF, and appending stuff"
60 CLOSE #1
A2: The solution above (linear search) is somewhat slow for large files. Exponential search is more complicated, but finds the end of a 10000-line file in ~0.03
seconds instead of ~31.6
seconds (1000x faster). Below is an example subroutine:
10 OPEN "filename.txt", AS #1
20 GOSUB 250 : 'probe now points to the last line, but file pointer DOES NOT NECESSARILY.
30 READ #1, probe; lastline$ : advance file pointer to probe
40 PRINT# 1, "We are now at EOF, and appending stuff"
50 PRINT "The previous last line", lastline$
60 CLOSE 1
200 END
250 probe=2 : DIM last(2) : last(0)=0 : last(-1)=2^52-1
255 '(0) is last good line , (-1) is last bad line (EOF), initialized to max int
260 READ #1, probe
265 ' read record at index (probe) from file #1, but not into any variables.
266 ' this is slightly faster than input#.
270 last(EOF(1)) = probe
275 'store the probed offset as either good or bad, depending on whether we hit EOF or not.
280 x = probe*2 : 'Exponential search for EOF
280 y = last(0) + INT((last(-1)-last(0))/2)
285 'halfway between last known good and last EOF (binary search)
290 probe = y XOR ((x XOR y) AND -(x < y))
295 ' probe = min(x,y); picks binary search when probe overshoots
300 IF probe > last(0) GOTO 260
305 ' probe>good implies (bad-good)/2>=1 implies EOF may lie beyond good+1; keep probing.
310 RETURN
A: You can create a BBS by running PPPD.EXE
, and pointing it at your BASIC program file. Your BBS will then appear in bbslist.txt
.
Your BBS baud-rate must be 115200 (11.520 kbps) in order for it to appear in the Telehack netstat. To gain access to faster baud-rates requires you to upgrade your modem firmware (both SYSADM
and BLUEBOX
badges are required.)
A: There are two methods. The Traditional "Pure BASIC" Method, and the Modern RegEx Method. Both methods are detailed below.
This method involves iterating through your string YOURSTRING$
and looking for a delimiter DELIMITER$
.
For every iteration put the actual character at that position in the string YOURSTRING$
in a temporary variable TSTR$
.
Once you have found the delimiter DELIMITER$
, save the result of the temporary variable TSTR$
into an array. MAXSTACK
tells you how many items are actually in the array.
See the example below:
10 DIM ARRAY(2)
20 DELIMITER = " "
30 YOURSTRING = "Hello World"
40 MAXSTACK = 0
45 REM PUT YOUR PROGRAM LOGIC HERE
50 GOSUB 100
55 REM PUT YOUR PROGRAM LOGIC HERE
60 END
100 REM split
110 TSTR = ""
120 FOR I = 1 TO LEN(YOURSTRING)
130 IF MID$(YOURSTRING, I, 1) = DELIMITER THEN GOTO 200
140 TSTR = TSTR + MID$(YOURSTRING, I, 1)
150 IF I = LEN(YOURSTRING) THEN GOTO 200
160 NEXT I
170 RETURN
200 REM We have found a delimiter and are pushing it into the array
210 MAXSTACK = MAXSTACK + 1
220 ARRAY(MAXSTACK) = TSTR
230 TSTR = ""
240 GOTO 160
Let's say, for this example, you have the string NAMES$
which is a list of names separated by a comma ,
. To access this as an array is very straightforward using Telehack language extentions:
10 NAMES$ = "Tom,Dick,Harry,Bob,Steve,Imhotep"
20 PATTERN$ = "[^\,]+"
30 FOR I = 1 TO TH_RE(NAMES$,PATTERN$,1)
40 PRINT TH_RE$(NAMES$,PATTERN$,I)
50 NEXT I
Tom
Dick
Harry
Bob
Steve
Imhotep
The above example uses both TH_RE
(number context), and TH_RE$
(string context).
A: The executable GOLF.EXE
contains multiple lessons on regular expressions. You can also find many RegEx-related challenges in the DOJO
.
A: Like this:
10 RANDOMIZE TIMER
20 MAXNR = 10
20 RNR = INT(RND(1)*MAXNR)
30 PRINT RNR
The above example is a pseudorandom number generator, with TIMER
being the seed.
A: You don't actually have to use line numbers at all in TeleBASIC! They are only necessary for when using GOTO
or GOSUB
.
You also don't have to put everything in uppercase, but doing so means your code will be more compatible with other historical flavours of BASIC.
Here is an example of a modern TeleBASIC program:
1 ' begin
input "What is your name? " n$
print "Hello, " n$ "! There are" len( n$ ) "characters in your name:"
for l = 1 to len( n$ )
? l ": " mid$( n$, l, 1 )
next : ?
input "Again? [y/n] " ; yn$
if yn$ = "y" then goto 1
? "Goodbye!"
end
What is your name? bob
Hello, bob! There are 3 characters in your name:
1 : b
2 : o
3 : b
Again? [y/n] y
What is your name? steve
Hello, steve! There are 5 characters in your name:
1 : s
2 : t
3 : e
4 : v
5 : e
Again? [y/n] n
Goodbye!
Additionally, there is a script written by archer which allows you to use labels instead of numbers.
Find it on archer's GitHub.
A: Refer to this guide by archer.
A: That's our mascot, Bassy the dart-mouthed bass.
An ANSI escape sequence is a sequence of ASCII characters, the first two of which are the ASCII "escape" character (chr$(27)
) and the left-bracket character [
(chr$(91)
).
The character or characters following the escape and left-bracket characters specify an alphanumeric code that controls a keyboard or display function.
For example, these can be used instead of, or in addition to LOCATE
(for locating the cursor in the window); COLOR
(for setting text and background colours) and getting the user's arrow-key input.
Using escape sequences can give you greater control over how your program displays its output. Be aware that not all terminal types support some of these sequences, and your terminal must support 256-bit colours in order to display such colours.
Standard escape codes are prefixed with Escape, which is represented in the following ways:
Format | Value |
---|---|
Ctrl-Key | ^[ |
Octal | \033 |
Unicode | \u001b |
Hexadecimal | \x1b |
Decimal | 27 |
This is then followed by the command, somtimes delimited by opening square bracket [
known as a Control Sequence Introducer (CSI), optionally followed by arguments and the command itself.
Arguments are delimeted by semi colon (;
).
For example boldred$ = chr$(27) + "[1;31m"
.
Name | Decimal | Octal | Hex | C-escape | Ctrl-Key | Description |
---|---|---|---|---|---|---|
BEL |
7 | 007 | 0x07 |
\a |
^G |
Terminal bell |
BS |
8 | 010 | 0x08 |
\b |
^H |
Backspace |
HT |
9 | 011 | 0x09 |
\t |
^I |
Horizontal TAB |
LF |
10 | 012 | 0x0A |
\n |
^J |
Linefeed |
VT |
11 | 013 | 0x0B |
\v |
^K |
Vertical TAB |
FF |
12 | 014 | 0x0C |
\f |
^L |
Formfeed |
CR |
13 | 015 | 0x0D |
\r |
^M |
Carriage return |
ESC |
27 | 033 | 0x1B |
\e |
^[ |
Escape character |
DEL |
127 | 177 | 0x7F |
<none> |
<none> |
Delete character |
Note: Some control escape sequences, like \e
for ESC, are not guaranteed to work in all languages and compilers. It is recommended to use the decimal, octal or hex representation as escape code.
The Ctrl-Key representation is simply associating the non-printable characters from ASCII code 1 with the printable characters from ASCII code 65 ("A"). ASCII code 1 would be ^A
(Ctrl-A), while ASCII code 7 (BEL) would be ^G
(Ctrl-G). This is a common representation (and input method) and historically comes from one of the VT series of terminals.
Sequence | Description |
---|---|
ESC[H |
Moves cursor to home position (0, 0) |
ESC[{line};{column}H |
Moves cursor to line #, column # |
ESC[{line};{column}f |
Moves cursor to line #, column # |
ESC[#A |
Moves cursor up # lines |
ESC[#B |
Moves cursor down # lines |
ESC[#C |
Moves cursor right # columns |
ESC[#D |
Moves cursor left # columns |
ESC[#E |
Moves cursor to start of next line, # lines down |
ESC[#F |
Moves cursor to start of previous line, # lines up |
ESC[#G |
Moves cursor to column # |
ESC[6n |
Request cursor position (reports as ESC[#;#R) |
ESC7 |
Save cursor position (DEC) |
ESC8 |
Restores the cursor to the last saved position (DEC) |
ESC[s |
Save cursor position (SCO) |
ESC[u |
Restores the cursor to the last saved position (SCO) |
ESC[?25h |
Show cursor |
ESC[?25l |
Hide cursor |
Note: Some sequences, like saving and restoring cursors, are private sequences and are not standardized. While some terminal emulators (i.e. xterm and derived) support both SCO and DEC sequences, they are likely to have different functionality. It is therefore recommended to use DEC sequences.
Sequence | Description |
---|---|
ESC[J |
Clears the screen |
ESC[0J |
Clears from cursor until end of screen |
ESC[1J |
Clears from cursor to beginning of screen |
ESC[2J |
Clears entire screen |
ESC[K |
Clears the current line |
ESC[0K |
Clears from cursor to end of line |
ESC[1K |
Clears from cursor to start of line |
ESC[2K |
Clears entire line |
Sequence | Reset Sequence | Description |
---|---|---|
ESC[1;34;{...}m |
Set graphics modes for cell | |
ESC[m |
Reset all modes (styles and colours) | |
ESC[0m |
Same as above | |
ESC[1m |
ESC[22m |
Set bold mode. |
ESC[2m |
ESC[22m |
Set dim/faint mode. |
ESC[3m |
ESC[23m |
Set italic mode. |
ESC[4m |
ESC[24m |
Set underline mode. |
ESC[5m |
ESC[25m |
Set blinking mode |
ESC[7m |
ESC[27m |
Set inverse/reverse mode |
ESC[8m |
ESC[28m |
Set hidden/invisible mode |
ESC[9m |
ESC[29m |
Set strikethrough mode. |
Note: Some terminals may not support some of the graphic mode sequences listed above.
Both dim and bold modes are reset with the ESC[22m
sequence. The ESC[21m
sequence is a non-specified sequence for double underline mode and only works in some terminals and is reset with ESC[24m
.
Most terminals support 8 and 16 colours, as well as 256 (8-bit) colours. These colours are set by the user, but have commonly defined meanings.
Colour | Foreground | Background |
---|---|---|
Black | 30 | 40 |
Red | 31 | 41 |
Green | 32 | 42 |
Yellow | 33 | 43 |
Blue | 34 | 44 |
Magenta | 35 | 45 |
Cyan | 36 | 46 |
White | 37 | 47 |
Default | 39 | 49 |
Reset | 0 | 0 |
Note: the Reset colour is the reset code that resets all colours and text effects, Use Default colour to reset colours only.
Most terminals, apart from the set of 8 regular colours, also support the "bright" or "bold" colours. These have their own set of codes, mirroring the normal colours, but with an additional ;1
in their codes:
e$ = chr$(27)
' Set style to bold, red foreground
hello$ = e$ + "[1;31m" + "Hello"
' Set style to dimmed white foreground with red background
world$ = e$ + "[2;37;41m" + "World"
Terminals that support the aixterm
specification provide bright versions of the ISO colours, without the need to use the bold modifier:
Colour | Foreground | Background |
---|---|---|
Bright Black | 90 | 100 |
Bright Red | 91 | 101 |
Bright Green | 92 | 102 |
Bright Yellow | 93 | 103 |
Bright Blue | 94 | 104 |
Bright Magenta | 95 | 105 |
Bright Cyan | 96 | 106 |
Bright White | 97 | 107 |
The following escape codes tells the terminal to use the given colour:
Sequence | Description |
---|---|
ESC[38;5;{ID}m |
Set foreground colour |
ESC[48;5;{ID}m |
Set background colour |
Where ID
should be replaced with the colour index from 0 to 255 of the following colour chart:
Generate this table with the following BASIC code:
10 FOR I = 0 TO 255
20 S$ = TH_SPRINTF$( "%4S", I )
30 ? CHR$(27) "[38;5;" STR$(I) "m" S$ ;
40 IF NOT (I+1) MOD 16 THEN ?
50 NEXT
This table starts with the original 16 colours (0-15).
The proceeding 216 colours (16-231) are formed by a 3bpc RGB value offset by 16, packed into a single value.
The final 24 colours (232-255) are grayscale starting from a shade slighly lighter than black, ranging up to shade slightly darker than white.
Some emulators interpret these steps as linear increments (256 / 24) on all three channels, although some emulators may explicitly define these values.
More modern terminals supports Truecolor (24-bit RGB), which allows you to set foreground and background colours using RGB values.
These escape sequences are usually documented poorly, if at all.
Sequence | Description |
---|---|
ESC[38;2;{r};{g};{b}m |
Set foreground colour as RGB. |
ESC[48;2;{r};{g};{b}m |
Set background colour as RGB. |
Note: ;38
and ;48
corresponds to the 16 colour sequence and is interpreted by the terminal to set the foreground and background colour respectively, whereas ;2
and ;5
sets the colour format.
These are some examples of private modes, which are not defined by the specification, but are implemented in most terminals.
Sequence | Description |
---|---|
ESC[?25l |
Make cursor invisible |
ESC[?25h |
Make cursor visible |
ESC[?47l |
Restore screen |
ESC[?47h |
Save screen |
ESC[?1049h |
Enables the alternative buffer |
ESC[?1049l |
Disables the alternative buffer |
DEC Special Graphics is a 7-bit character set developed by Digital Equipment Corporation.
This was used very often to draw boxes on the VT100 video terminal and the many emulators, and used by bulletin board software.
Sequence | Description |
---|---|
ESC(0 |
Enable DEC special graphics |
ESC(B |
Disable DEC special graphics |
10 PRINT CHR$(27) + "[92mThe foreground is green" CHR$(27) "[m"
20 PRINT CHR$(27) + "[103mThe background is yellow" CHR$(27) "[m"
10 PRINT CHR$(27) + "[38;5;134mThe foreground is purple" CHR$(27) "[m"
20 PRINT CHR$(27) + "[48;5;117mThe background is sky blue" CHR$(27) "[m"
10 KEY$ = INKEY$
20 IF KEY$ = CHR$(27) THEN KEY$ = INKEY$ : IF KEY$ = "[" THEN GOTO 40
30 GOTO 10
40 KEY$ = INKEY$
50 IF KEY$ = "A" THEN PRINT "UP"
60 IF KEY$ = "B" THEN PRINT "DOWN"
70 IF KEY$ = "C" THEN PRINT "RIGHT"
80 IF KEY$ = "D" THEN PRINT "LEFT"
90 GOTO 10