Disaster

Command Summary

Tests if one value is larger than or equal to another.

Command Syntax

value1value 2

Press [♦][>] to enter ≥.

This command works on all calculators.

1 byte

The ≥ operator compares two values, returning true if the left side is greater or if the two are equal, and false otherwise. It is a basic building block of the conditions used by commands such as If, when(), and While. The results of ≥ and the other relational operators (=, , >, <, and ) can be combined with the and, or, xor, and not operators to create more complicated conditions.

It returns a single value for most types of data, and returns false if the two sides are mismatched in type: comparing a single number to a list, for instance, or comparing two lists that are of a different size. The only exception is when comparing two lists or two matrices of the same size: in that case, it compares them element-by-element, and returns a list or matrix of true/false values.

:3≥4
false
:3≥2
true
:{1,2,3}≥{3,2,1}
{false  true  true}


If either side or both contains undefined variables, ≥ will wait to return a value. You can do math with the resulting inequality, and if an operation makes sense, it will be applied to both sides: for instance, if x≥y, then you can negate it to get -x≤-y. An operation will not be applied to both sides if it wouldn't be consistent with the previous inequality: for example, you can't square both sides, since even if x≥y the comparison between x^2 and y^2 could go in any order. You can also extract the two halves of the inequality with left() and right().

The ≥ operator can also compare strings. It does so by comparing the character codes of each character, and orders the strings by the first difference it finds. This ideally means that the strings are ordered by dictionary order: for example, "apple"≥"aardvark", since it would come later in the dictionary.

However, the problem is that all uppercase letters have a smaller character code than lowercase letters, so this only holds true if the strings are the same case. Otherwise, strange results can happen: for instance, "aardvark"≥"Apple", since "a" comes after "A".

# Related Commands

• = (equal)
• (not equal)
• > (greater than)
• < (less than)
• (less than or equal)

Command Summary

Tests if one value is larger than another.

Command Syntax

value1>value 2

Press [2nd][>] to enter >.

This command works on all calculators.

1 byte

The > operator compares two values, returning true if the left side is greater, and false otherwise. It is a basic building block of the conditions used by commands such as If, when(), and While. The results of > and the other relational operators (=, , , <, and ) can be combined with the and, or, xor, and not operators to create more complicated conditions.

It returns a single value for most types of data, and returns false if the two sides are mismatched in type: comparing a single number to a list, for instance, or comparing two lists that are of a different size. The only exception is when comparing two lists or two matrices of the same size: in that case, it compares them element-by-element, and returns a list or matrix of true/false values.

:3>4
false
:3>2
true
:{1,2,3}>{3,2,1}
{false  false  true}


If either side or both contains undefined variables, > will wait to return a value. You can do math with the resulting inequality, and if an operation makes sense, it will be applied to both sides: for instance, if x>y, then you can negate it to get -x<-y. An operation will not be applied to both sides if it wouldn't be consistent with the previous inequality: for example, you can't square both sides, since even if x>y the comparison between x^2 and y^2 could go in any order. You can also extract the two halves of the inequality with left() and right().

The > operator can also compare strings. It does so by comparing the character codes of each character, and orders the strings by the first difference it finds. This ideally means that the strings are ordered by dictionary order: for example, "apple">"aardvark", since it would come later in the dictionary.

However, the problem is that all uppercase letters have a smaller character code than lowercase letters, so this only holds true if the strings are the same case. Otherwise, strange results can happen: for instance, "aardvark">"Apple", since "a" comes after "A".

# Related Commands

• = (equal)
• (not equal)
• (greater than or equal)
• < (less than)
• (less than or equal)

Command Summary

Tests if two values are different.

Command Syntax

value1value 2

Press [♦][=] key to enter ≠.

This command works on all calculators.

1 byte

The ≠ operator compares two values, returning true if they're different, and false if they're equal. It is a basic building block of the conditions used by commands such as If, when(), and While. The results of ≠ and the other relational operators (=, >, , <, and ) can be combined with the and, or, xor, and not operators to create more complicated conditions.

It returns a single value for most types of data, and returns true if the two sides are mismatched in type: comparing a single number to a list, for instance, or comparing two lists that are of a different size. The only exception is when comparing two lists or two matrices of the same size: in that case, it compares them element-by-element, and returns a list or matrix of true/false values.

:2+2≠4
false
:2+2≠5
true
:{1,2,3}≠{1,4,3}
{false  true  false}


If either side or both contains undefined variables, ≠ will wait to return a value unless it's something clearly true or false for any value of the variable (for instance, x≠x). You can do math with the resulting inequality: if an operation makes sense, it will be applied to both sides: for instance, if x≠y, then you can negate it to get -x≠-y. An operation will not be applied to both sides if it wouldn't be consistent with the previous inequality: for example, you can't square both sides, since if x≠y it can still be the case that x^2=y^2. You can also extract the two halves of the inequality with left() and right().

# Related Commands

• = (equal)
• > (greater than)
• (greater than or equal)
• < (less than)
• (less than or equal)

Command Summary

Tests if two values are equal.

Command Syntax

value1=value 2

Press the [=] key to enter =.

This command works on all calculators.

1 byte

The = operator compares two values, returning true if they're equal, and false otherwise. It is a basic building block of the conditions used by commands such as If, when(), and While. The results of = and the other relational operators (, >, , <, and ) can be combined with the and, or, xor, and not operators to create more complicated conditions.

It returns a single value for most types of data, and returns false if the two sides are mismatched in type: comparing a single number to a list, for instance, or comparing two lists that are of a different size. The only exception is when comparing two lists or two matrices of the same size: in that case, it compares them element-by-element, and returns a list or matrix of true/false values.

:2+2=4
true
:2+2=5
false
:{1,2,3}={1,4,3}
{true  false  true}


If either side or both contains undefined variables, = will wait to return a value unless it's something clearly true for any value of the variable (for instance, x=x). You can do math with the resulting equation (most operations will be applied to both sides), and extract the two halves of it with left() and right().

# Optimization

Testing "If x=true" is redundant in most cases; you can shorten that to "If x". Similarly, "If x=false" can be "If not x".

# Related Commands

• (not equal)
• > (greater than)
• (greater than or equal)
• < (less than)
• (less than or equal)

Command Summary

Converts a number to a string with specified formatting.

Command Syntax

format(number[,options])

• Press 2nd MATH to enter the MATH popup menu.
• Press D to enter the Strings submenu.
• Press 9 to select format(.

This command works on all calculators.

3 bytes

NOTE: Due to the limitations of the wiki markup language, the E command on this page does not appear as it would on the calculator. See Wiki Markup Limitations for more information.

The format() command is a more advanced version of string() specifically intended to convert numbers (usually, floating-point numbers) to strings. It can override settings like Display Digits and Exponential Format, and instead lets the user input these options and more in a string. Since it converts even integer input to floating-point, it also doesn't depend on the Base setting.

The format string can have the following values (not case-sensitive):

• F[number] overrides Display Digits to fixed-point with [number] digits after the decimal; [number] can be omitted to use the default, which is 12; it must be between 0 and 12.
• S[number] does this and also overrides Exponential Format to scientific.
• E[number] does this and also overrides Exponential Format to engineering.
• G[number][character] does this and also separates the digits to the left of the decimal into groups of three, with [character] as the separator. The default for [character], if it is omitted, is a comma. If you make the separator a period, then the decimal point will become a comma.

To all of these, you can also append R[character] to replace the decimal point with [character]. Only 'symbols' are allowed for [character], which is a bit vague: numbers and letters are not allowed, nor are some international characters.

:format(π,"F")
"3.14159265359"
:format(2^25,"S6")
"3.355443e7"
:format(2^25,"E6")
"33.55443e6"
:format(2^25,"G0")
"33,554,432."
:format(2^25,"G0 R ")
"33 554 432 "


If the format string is empty, or if the argument is omitted entirely, format() will convert the number to a decimal, but otherwise will work just like string()

# Error Conditions

260 - Domain error happens when the format string is improperly formatted.

# Related Commands

Command Summary

Joins two strings together.

Command Syntax

string&string

• Press 2nd MATH to enter the MATH popup menu.
• Press D to enter the String submenu.
• Press 4 to select &.

This command works on all calculators.

2 bytes

The & operator joins two strings together, one after the other, returning one large string.

:"Hello"&"World"
"HelloWorld"
:5→n
:"The value of n is "&string(n)
"The value of n is 5"


Appending strings is very useful when you want to display text. If you want to display more than one string on the same line, for instance with the Text command, you'll need to use & to combine the strings.

By default, & doesn't put in any separation between the strings, which can look weird: you can see this in the above example, where joining "Hello" and "World" made "HelloWorld". With multiple uses of &, you can put in any separator you like:

:"Hello"&" "&"World"
"Hello World"


If you want to use & to build up a string from scratch, start with "" — the empty string.

# Related Commands

Command Summary

Shifts the elements of a list, string, or binary integer.

Command Syntax

shift(object[,places])

• Press 2nd MATH to enter the MATH popup menu.
• Press E to enter the Base submenu.
• Press B to select shift(.

This command works on all calculators.

2 bytes.

When shift() is applied to lists or strings, it moves every element or character over, removing the elements that were shifted off the end, and filling in empty spaces with an undefined value: undef for lists and a space for strings. The default action is to shift everything one element right.

A second argument gives the direction and number of places to shift the list or string. Positive numbers are shifts to the left, and negative numbers are shifts to the right, so the default action shift(object) is equivalent to shift(object,-1). Here are some examples:

:shift({1,2,3,4,5})
{undef  1  2  3  4}
:shift("Hello")
" Hell"
:shift({1,2,3,4,5},2)
{3  4  5  undef  undef}
:shift("TI-Basic",-3)
"   TI-Ba"


shift() can also be used on integers, treating them as a sequence of bits (this makes the most sense when expressing them in binary). In this case, the integer is expressed as a 32-bit signed integer (larger integers are truncated), which is then bit-shifted.

When shifting right, the integer is sign extended: that is, the new bits introduced are 1 if the original leftmost bit was 1, and 0 if the original leftmost bit was 0. This preserves the sign of the integer. When shifting left, the integer is zero extended: the new bits are always 0.

As with lists and strings, the default action of shift() is to shift the integer one position right. A second argument gives the direction and number of places to shift the list or string. Positive numbers are shifts to the left, and negative numbers are shifts to the right.

:shift(0b00000000000000000000000011111111)▶Bin
0b00000000000000000000000001111111
:shift(0b10000000000000000000000011111111)▶Bin
0b11000000000000000000000001111111
:shift(1,10)
1024


# Related Commands

Command Summary

Converts any expression to a string.

Command Syntax

string(expression)

• Press 2nd MATH to enter the MATH popup menu.
• Press D to enter the String submenu.
• Press 1 to select string(.

This command works on all calculators.

2 bytes

The string() command converts any expression to its string form. This applies to numbers, but also to lists, matrices, symbolic expressions, and equations. The result depends on all the mode settings that are typically involved with displaying a number: base, exact/approx setting, etc.

:string(50)
"50"
:string({1,2,3,4,5})
"{1,2,3,4,5}"
:string(1/(1-x))
"-1/(x-1)"


The main use of string() is with output commands like PtText, PxlText, Text, Title, etc. These commands only work with strings, so for any other data type, you'll have to use string() first — & will also come in handy. For example:

:Text "The value of x is: "&string(x)


If you're just converting numbers, you might also want to look into format(), which only applies to numbers and also puts them in a specific form.

Together with the # (indirection) operator, string() can be used to access variables like a1, a2, a3, …, in order:

:#("a"&string(n))


# Related Commands

Command Summary

Returns a subsection from the right of a list or string, or the right hand side of an equation.

Command Syntax

right(equation)
right(list-or-string,length)

• Press 2nd MATH to enter the MATH popup menu.
• Press 3 to enter the List submenu.
• Press B to select right(.

This command works on all calculators.

2 bytes

When applied to a list or a string, right(x,length) gets the last (right-most) length elements/characters of x.

When applied to an equation (such as x=5) or an inequality (such as x<3), right() returns the right-hand side of the equation. This only works for equations that don't get simplified: right(2+2=4) will not work, because 2+2=4 will return 'true' first.

:right({1,2,3,4,5},3)
{3  4  5}
:right("TI-Basic Developer",9)
"Developer"
:right(x^2+2x+1>0)
0
:right({1,2,3,4,5},0)
{}


# Error Conditions

260 - Domain error happens when the argument is not a list, string, or equation, or is an equation that has simplified.

# Related Commands

Command Summary

Returns a subsection from the left of a list or string, or the left hand side of an equation.

Command Syntax

left(equation)
left(list-or-string,length)

• Press 2nd MATH to enter the MATH popup menu.
• Press 3 to enter the List submenu.
• Press 9 to select left(.

This command works on all calculators.

2 bytes

When applied to a list or a string, left(x,length) gets the first length elements/characters of x. This is an alternative to mid(), which will do the same thing from any point in the list or string, not just the beginning.

When applied to an equation (such as x=5) or an inequality (such as x<3), left() returns the left-hand side of the equation. This only works for equations that don't get simplified: left(2+2=4) will not work, because 2+2=4 will return 'true' first.

:left({1,2,3,4,5},3)
{1  2  3}
:left("TI-Basic Developer",8)
"TI-Basic"
:left(x^2+2x+1>0)
x^2+2*x+1
:left({1,2,3,4,5},0)
{}


# Optimization

Use left() instead of mid() when the substring starts at the beginning of the list or string.

# Error Conditions

260 - Domain error happens when the argument is not a list, string, or equation, or is an equation that has simplified.

# Related Commands

Command Summary

Generates a random polynomial.

Command Syntax

randPoly(var,deg)

• Press 2nd MATH to enter the MATH popup menu.
• Press 7 to enter the Probability submenu.
• Press 8 to select randPoly(.

This command works on all calculators.

1 byte

The randPoly() command generates a random polynomial. randPoly(var,deg) generates a random polynomial in variable var of degree deg. The coefficients of each power of var are random integers from -9 to 9.

:RandSeed 0
:randPoly(x,5)
4*x^5-2*x^4-7*x^2+8*x+8


Using the RandSeed command makes the resulting polynomial entirely predictable: every time you set the random seed to some variable, you will get the same random coefficients afterwards. Also see RandSeed for details of how random numbers are generated.

# Error Conditions

260 - Domain error happens when the value of deg is not between 0 and 99.

# Related Commands

Command Summary

Generates a random matrix.

Command Syntax

randMat(rows,columns

• Press 2nd MATH to enter the MATH popup menu.
• Press 7 to enter the Probability submenu.
• Press 7 to select randMat(.

This command works on all calculators.

1 byte

The randMat() command generates a random matrix: randMat(rows,columns) generates a rows by columns matrix whose entries are random integers between -9 and 9.

:RandSeed 0
:randM(3,2)
[4  -2]
[0  -7]
[8  8 ]


Using the RandSeed command makes the random matrix entirely predictable: after setting the random seed to some value, the same random matrix will be returned every time (assuming the size is the same). See the RandSeed page for details of how random numbers are generated.

# Error Conditions

260 - Domain error happens when the rows and columns parameters aren't positive integers..

# Related Commands

This sitemap is a list of the pages in the 68k section of the site, organized in a hierarchical fashion for easy viewing. Please note that this does not include all of the pages in the 68k section, for instance the command pages.

# References

Command Summary

Catches errors that occur in a block of code.

Command Syntax

:Try
(block of code)
:Else
(error-catching code)
:EndTry

Starting in the program editor:

• Press F2 to enter the Control menu.
• Press 2 to enter the If..Then submenu.
• Press 4 to select Try..EndTry.

This command works on all calculators.

2 bytes for Try;
2 bytes for Else;
2 bytes for EndTry.

The Try command is used to "catch" errors that occur in a block of code. If an error occurs in a Try..EndTry code block, it doesn't display an error message and exit the program. Instead, it records the type of error in the system variable errornum, and jumps to the Else section of the Try..EndTry block.

Here, you have several options. By checking the Errors page, you can test errornum for specific values to find out what kind of error happened. Ultimately, you'll want to use one of two commands:

• ClrErr to cancel the error.
• PassErr to display the error message and exit the program, as usual.

Here is an example of Try..EndTry in action:

:Try
: UnArchiv var
:Else
: Disp "var is undefined!"
: ClrErr
:EndTry


For most errors, Try..EndTry blocks aren't the way to go because you want to prevent them in the first place. They are a good way to handle special cases or circumstances out of your control. Here are two situations you might use Try..EndTry in:

• If your program uses external variables, you might surround that part of the code in a Try..EndTry block, rather than do all the tests to make sure they are unlocked, unarchived, etc.
• If your program requires specially-formatted input, instead of sanity checking it first you might let the program take untreated input, and catch the errors that result from an incorrect format.

# Error Conditions

290 - EndTry is missing the matching Else statement happens when the Try..EndTry block doesn't contain an Else.

490 - Invalid in Try..EndTry block happens when ??.

# Related Commands

Command Summary

Generates a random normally-distributed number.

Command Syntax

randNorm(mean,std-dev)

• Press 2nd MATH to enter the MATH popup menu.
• Press 7 to enter the Probability submenu.
• Press 5 to select randNorm(.

This command works on all calculators.

1 byte

The randNorm() command generates a random number that is normally distributed, with a given mean (first parameter) and standard deviation (second parameter). This means that on average, randNorm(x,y) will give a result of about x; it's 95% certain to be within 2*y of x.

See rand() and RandSeed for more details on the random number generator.

# Formula

The formula for randNorm() is different from the one used by the TI-83 series. To generate normally-distributed values from the output of rand(), the calculator uses the polar form of the Box-Muller transform. The algorithm goes as follows:

First, generate two uniformly distributed numbers u and v in [-1,1]. Keep doing this until the result lies in the unit circle; the point (0,0), though it's unlikely to occur, is discarded as well. Let s equal u2+v2.

Usually, Box-Muller is used to produce two normally-distributed random numbers, by the formula below. The TI only uses the second of the results:

(1)
\begin{align} z_0=u\cdot\sqrt{\frac{-2\ln s}{s}}\hspace{2em}z_1=v\cdot\sqrt{\frac{-2\ln s}{s}} \end{align}

The result is distributed according to the standard normal distribution: that is, with mean 0 and standard deviation 1. It's easy to get any other normal distribution by scaling: multiplying by the standard deviation, and then adding the mean.

In TI-Basic, the code for randNorm(μ,σ) would be:

:Loop
: 2*rand()-1→u
: 2*rand()-1→v
: u^2+v^2→s
: If 0<s and s<1
:  Return μ+σ*v*√(-2*ln(s)/s)
:EndLoop


# Related Commands

Command Summary

Returns the size of a list, matrix, or string.

Command Syntax

dim(list-matrix-or-string)

• Press 2nd MATH to enter the MATH menu.
• Press D to enter the String submenu.
• Press 3 to select dim(.

This command works on all calculators.

1 byte

The dim() command returns the size of a list, matrix, or string:

• The number of elements for a list.
• The number of characters for a string.
• A list of {number of rows or columns} for a matrix.

This command is critical to using any of these objects, for instance, if you want to write a For..EndFor loop to look at every element.

However, unlike the TI-83 series version, you can't use the dim() command to change the size of anything. Use mid() to get a smaller list or string (subMat() for a matrix), or use newList() and newMat() to create a list or matrix of a specific size.

:dim({1,2,3,4,5}
5
:dim("TI-Basic Developer")
18
:dim([1,2,3;4,5,6])
{2  3}


# Optimization

For matrices, using rowDim() and colDim() is usually better in all practical situations, and you don't have to remember which number goes first.

# Related Commands

Command Summary

Rotates a string, list, or binary integer.

Command Syntax

rotate(object,places)

• Press 2nd MATH to enter the MATH menu.
• Press E to enter the Base submenu.
• Press C to select rotate(.

This command works on all calculators.

2 bytes

When rotate() is applied to lists or strings, it moves every element or character over, moving the displaced elements over to the other end. By default, it shifts everything right one space, and moves the rightmost element to the beginning.

A second argument gives the direction and number of places to rotate the list or string. Positive numbers are rotations to the left, and negative numbers are rotation to the right, so the default action rotate(object) is equivalent to rotate(object,-1). Here are some examples:

:rotate({1,2,3,4,5})
{5  1  2  3  4}
:rotate("Hello")
"oHell"
:rotate({1,2,3,4,5},2)
{3  4  5  1  2}
:rotate("TI-Basic",-3)
"sicTI-Ba"


rotate() can also be used on integers, treating them as a sequence of bits (this makes the most sense when expressing them in binary). In this case, the integer is expressed as a 32-bit signed integer (larger integers are truncated), whose bits are then rotated.

As with lists and strings, the default action of rotate() is to rotate the integer one position right. A second argument gives the direction and number of places to rotate the list or string. Positive numbers are rotations to the left, and negative numbers are rotations to the right.

:shift(0b00000000000000000000000011111111)▶Bin
0b10000000000000000000000001111111
:rotate(1,10)
1024


# Related Commands

Command Summary

Returns the remainder of a division.

Command Syntax

remain(dividend,divisor)

• Press 2nd MATH to enter the math popup menu.
• Press 1 to enter the Number submenu.
• Press A to select remain(.

This command works on all calculators.

1 byte

The remain() command returns the remainder of a division: remain(A,B) is calculated as A-B*intDiv(A,B) which in turn is equivalent to A-B*iPart(A/B). Although this operation is most useful for dividing whole numbers, this definition works for any number, whole or decimal, real or complex. Additionally, remain(X,0) is defined as X.

The related mod() command returns the same results for positive numbers, however, they disagree when negative integers enter the mix. The result of mod() is defined just as remain(), but with int() instead of iPart(). This means that remain() gives a negative answer if the dividend is negative, and mod() gives a negative answer if the divisor is negative.

:remain(125,3)
2
:remain(-125,3)
-2
:remain(2*i+1,i+1)
i


The remain() command also works for lists and matrices. Used with a list or matrix and a number, remain() is applied to the number paired with every element of the list or matrix. Used with two lists or two matrices, which must match in size, remain() is applied to matching elements of the list or matrix.

Use intDiv() and remain() for the quotient and remainder results of long division, respectively.

# Error Conditions

240 - Dimension mismatch happens when two list or matrix arguments don't match in size.

# Related Commands

Command Summary

Adds together the evaluations of an expression with one variable taking on a range of values.

Command Syntax

∑(expression, variable, start, end)

• Press 2nd MATH to enter the MATH popup menu.
• Press B to enter the Calculus submenu.
• Press 4 to select ∑(.

This command works on all calculators.

2 bytes

∑() is used to add a sequence of numbers. ∑(expression, variable, start, end) will evaluate expression for variable=start, then for variable=start+1, all the way through variable=end, and add up the results:

:∑(f(x),x,1,5)
f(1)+f(2)+f(3)+f(4)+f(5)
:∑(x^2,x,1,5)
55


In this way, ∑() is no different from taking sum() of a sequence generated by seq(). However, ∑() can be used for more abstract calculations — for instance, when start or end is an undefined variable, it will try to find the sum in terms of that variable. ∑() can also be used to sum an infinite series (just make the value of end infinity — ∞).

:∑(x^2,x,1,n)
n*(n+1)*(2*n+1)/6
:∑(2^-x,x,1,∞)
1


# Optimization

It's a good idea to replace sum(seq( by ∑( whenever it occurs. The only difficulty arises if seq() uses its step argument, since ∑() doesn't have one. There are three options:

• Forget about using ∑() and just go with the sum(seq( alternative.
• Use a when() expression (probably with mod()) to select the entries you care about.
• Use a linear equation to transform values from 1 to N into the correct values with the step.

Here is an example of these approaches:

:sum(seq(x^2,x,1,9,2))


This calculates 12+32+52+72+92.
:∑(when(mod(x,2)=1,x^2,0),x,1,9)


The when() command selects only the odd numbers — those with mod(x,2)=1 — from 1 to 9.
:∑((2x-1)^2,x,1,5)


The equation 2*x-1 transforms the numbers 1..5 into the odd numbers 1..9.

# Related Commands

Command Summary

Checks the value of the system clock.

Command Syntax

checkTmr(time)

This command can't be found in any menu besides the command catalog.

This command requires a calculator with AMS version 2.07 or higher (it will also work on any TI-89 Titanium or Voyage 200 calculator)

2 bytes

The checkTmr() command, together with startTmr() uses the built-in system clock to measure the time (in seconds) that passed between two points of the program. Make sure that the clock is on (with ClockOn before using these).

The name of the commands reflects their use: you can think of a startTmr() call as creating and starting a timer:

:startTmr()→timer


The checkTmr() command will then return the number of seconds that have elapsed on the timer (without stopping it):

:Disp "Seconds elapsed:",checkTmr(timer)


This is a good abstraction and you don't need to know the details of how startTmr() and checkTmr() work to use them. In reality, what startTmr() actually returns is the current value of a system timer (which increases by 1 every second). The checkTmr() command does the same thing, but subtracts its parameter: so checkTmr(x) is equivalent to startTmr()-x.

Because both startTmr() and checkTmr() deal with whole numbers of seconds, the resulting difference in time could be off by up to a second in either direction. That is, if checkTmr() gives 15 seconds as the time, you know the time that actually passed is between 14 and 16 seconds.

The startTmr() and checkTmr() commands can be used to figure out how much time a command or routine takes with much greater precisions by running it multiple times. For example:

:startTmr()→t
:For i,1,1000
: somecmd()
:Disp checkTmr(t)


Suppose that the result displayed was 100 seconds. This is accurate to 1 second, so the actual time was between 99 and 101 seconds. However, this actual time is for 1000 repetitions of somecmd() (we assume that the time the code takes to increment i is negligible, although that may also be taken into account). So somecmd() repeated only once takes between 99/1000 and 101/1000 seconds, so the actual time is 100 ms, measured to within 1 millisecond error.

See Code Timings for more information on this, as well as the results of some common comparisons.

# Related Commands

Command Summary

Returns the value of the system clock.

Command Syntax

startTmr()

This command can't be found in any menu besides the command catalog.

This command requires a calculator with AMS version 2.07 or higher (it will also work on any TI-89 Titanium or Voyage 200 calculator)

3 bytes

The startTmr() command returns the number of seconds that passed since 00:00 GMT of January 1, 1997 — as far as the calculator knows, anyway, since this value is adjusted every time the current time and date changes with setTime() or setDate(). If the clock is running, this number is also updated every second, which is how the calculator keeps track of time.

Together with checkTmr(), startTmr() can be used to measure off a time interval (in seconds) while a program is running (make sure to use ClockOn first). the name of the commands reflects their use: you can think of a startTmr() call as creating and starting a timer:

:startTmr()→timer


The checkTmr() command will then return the number of seconds that have elapsed on the timer (without stopping it):

:Disp "Seconds elapsed:",checkTmr(timer)


This is a good abstraction and you don't need to know the details of how startTmr() and checkTmr() work to use them. In reality, checkTmr(x) returns startTmr()-x, so using it on the result of startTmr() gives a time difference.

Because both startTmr() and checkTmr() deal with whole numbers of seconds, the resulting difference in time could be off by up to a second in either direction. That is, if checkTmr() gives 15 seconds as the time, you know the time that actually passed is between 14 and 16 seconds.

The startTmr() and checkTmr() commands can be used to figure out how much time a command or routine takes with much greater precisions by running it multiple times. For example:

:startTmr()→t
:For i,1,1000
: somecmd()
:EndFor
:Disp checkTmr(t)


Suppose that the result displayed was 100 seconds. This is accurate to 1 second, so the actual time was between 99 and 101 seconds. However, this actual time is for 1000 repetitions of somecmd() (we assume that the time the code to increment i takes is negligible, although that, too, may be taken into account). So somecmd() repeated only once takes between 99/1000 and 101/1000 seconds, so the actual time is 100 ms, measured to within 1 millisecond error.

See Code Timings for more information on this, as well as the results of some common comparisons.

# Related Commands

Command Summary

Takes the tangent of a number (usually, an angle).

Command Syntax

tan(angle)

Press the TAN button to enter tan(.

This command works on all calculators.

1 byte

The tan() command returns the tangent of an angle measure. Naturally, the result depends on the angle mode the calculator is in: radian, degree, or (in AMS version 3.10) gradian. You can also use one of the r, °, G marks to specify an angle mode.

For many common angles, tan() can compute an exact result. Other angles, the calculator will leave alone unless it's in approximate mode (or unless you make it approximate), and then it will give a decimal approximation. As long as the calculator is in radian mode, tan() can be used with complex numbers as well.

:tan(60°)
√3
:tan(x+π)
tan(x)
:tan(ix)
tanh(x)*i


If tan() is applied to a list, it will take the tangent of every element in the list.

The tan() of a matrix is not (in general) the same as taking the tangent of every element of the matrix. A different definition is used to compute the result; see Matrices and Their Commands. It requires the matrix to be square and diagonalizable in order to apply.

# Error Conditions

230 - Dimension happens when taking tan() of a matrix that isn't square.

260 - Domain error happens when taking tan() of a complex number in degree or gradian mode.

665 - Matrix not diagonalizable happens when taking tan() of a matrix that isn't diagonalizable.

# Related Commands

Command Summary

Takes the cotangent of a number (usually, an angle).

Command Syntax

cot(angle)

• Press 2nd MATH to enter the MATH popup menu.
• Press A to enter the Trig submenu.
• Press 6 to select cot(.

This command requires a calculator with AMS version 2.07 or higher (it will also work on any TI-89 Titanium or Voyage 200 calculator)

1 byte

The cot() command returns the cotangent (the reciprocal of the tangent) of an angle measure. Naturally, the result depends on the angle mode the calculator is in: radian, degree, or (in AMS version 3.10) gradian. You can also use one of the r, °, G marks to specify an angle mode.

The cot() command, along with 11 other trig and hyperbolic functions, was added with AMS version 2.07. It can be easily replaced on earlier versions with 1/tan(x), which is what it simplifies to anyway.

For many common angles, cot() can compute an exact result. Other angles, the calculator will leave alone unless it's in approximate mode (or unless you make it approximate), and then it will give a decimal approximation. As long as the calculator is in radian mode, cot() can be used with complex numbers as well.

:cot(60°)
√3/3
:cot(x)
1/tan(x)
:cot(0)
undef


If cot() is applied to a list, it will take the cotangent of every element in the list. However, it can't be applied to matrices the way cos() can (this is probably an oversight; all the trig and hyperbolic functions that were present in all AMS versions work with matrices, but the ones added in version 2.07 do not).

# Error Conditions

260 - Domain error happens when taking cot() of a complex number in degree or gradian mode.

# Related Commands

 Jul 27 — The TI-Basic Developer goes Pro on Wikidot!

Work on this game begins now.

If you start a variable transfer while in a program, it will end the program. I believe, that the calc can do getcalc to the computer. I will test it on Monday.

 Jul 25 — burr, the founder of this site, transfers Master Administrator status to DarkerLine.

A futuristic Role Playing Game with several abilities and a unique style of battle.

Yes, another RPG to add to the projects page.

Features:
Utilizes the Horiz function, which splits the screen between text and graphics.
Supports a dynamic inventory system similar to professional rpgs, with item stacking.
Runs decently on 83+ and almost too fast on 84/+/SE. Seriously, the battle animations are pretty hard to make out.
A unique battle engine: you have to build up charge in battle to use stronger techniques and abilities
A graphical overworld and battle engine; this is not a text-based game.
Supports NPC's, random encounters, selling items, and most typical RPG stuff.

Goals:
3-4 areas and bosses
A storyline that makes sense
Finished by the end of summer—although that might be a bit overambitious

Screenshots:
(note that I'm having a bit of a problem with the run indicator.)

Unfortunately, the rich vocabulary of wiki syntax doesn't allow to properly display a command in titles and code blocks. When this happens, the offending page will link here so we can properly apologize, clarify what is meant, and give the syntax that displays them correctly where it is possible to do so.

Here are the commands and symbols that suffer from this problem:

• The r command
• Use ^^r^^ to render it correctly where possible.
• Replace it with ^r in code blocks.
• The G command
• Use ^^G^^ to render it correctly where possible.
• Replace it with ^G in code blocks.
• The d() command
• Use //d//() to render it correctly where possible.
• Use //[[[68k:d]]]//[[[68k:d|()]]] to render it in a link.
• Use [[span style="font-style:italic;"]][[[68k:d]]][[/span]][[[68k:d|()]]] if the above fails to work properly.
• Replace it with d() in code blocks.
• The E command
• Use [[size 75%]]E[[/size]] to render it correctly where possible.
• Use [[size 75%]][[[68k:e-ten|E]]][[/size]] to render it in a link.
• Replace it with E in code blocks.
• The T command
• Use ^^T^^ to render it correctly where possible.
• Use ^^[[[68k:transpose|T]]]^^ to render it in a link.
• Replace it with ^T in code blocks.
• The $\bar{x}$ and $\bar{y}$ symbols.
• Use [[$\bar{x}$]] to render $\bar{x}$ correctly.
• Use [[$\bar{y}$]] to render $\bar{y}$ correctly.
• Avoid using these in code blocks, or replace with xbar and ybar.

On a related note, there are two operators that don't have any trouble being displayed, but can't be used in a link, so every page that refers to them has to dance around the issue much like this page does in the next sentence. They are: # (indirection) and | (with).

Command Summary

Takes a symbolic derivative of an expression.

Command Syntax

d(expression,variable[,order])

• Press 2nd MATH to enter the MATH popup menu.
• Press B to enter the Calculus submenu.
• Press 1 to select d(.

This command works on all calculators.

2 bytes

NOTE: Due to the limitations of the wiki markup language, the d() command on this page does not appear as it would on the calculator. See Wiki Markup Limitations for more information.

The d() command takes the derivative of an expression with respect to a given variable. All other variables are treated as constant.

Optionally, you can give it a third argument (an integer), and take the derivative that many times. If the argument is negative, it will actually integrate.

:d(x^2,x)
2*x
:d(x^5,x,4)
120*x
:d(x^2+y^2+2*x*y,x)
2*x+2*y


# Related Commands

NOTE: Due to the limitations of the wiki markup language, the {$cmd} command on this page does not appear as it would on the calculator. See Wiki Markup Limitations for more information. Command Summary Calculates several summary statistics for a list. Command Syntax OneVar list[,freq,arg3,arg4] Menu Location 1. Press 2nd MATH to enter the MATH popup menu. 2. Press 6 to enter the Statistics submenu. 3. Press 1 to select OneVar. This command works on all calculators. 3 bytes The OneVar command generates some summary statistics for a list. In its simplest form, it takes one argument — a list variable to analyze (it won't work with a list expression). It will store results to the following system variables: •$\bar{x}$— the average, as given by mean() • Σx — the sum, as given by sum() • Σx2 — the sum of squares • Sx — the sample standard deviation, as given by stdDev() • σx — the population standard deviation, as given by stDevPop() • nStat — the length of the list, as given by dim() • minX — the smallest element, as given by min() • q1 — the first quartile • medStat — the median, as given by median() • q3 — the third quartile • maxX — the largest element, as given by max() It won't actually display any of these results without prompting (although you could check the variables to find out their values). To display all of these statistics, use the ShowStat command. # Advanced Uses The OneVar command takes up to 4 list arguments. The second argument, if present, is a list of frequencies. This must be the same length as the first list, and if it's there, its Nth element indicates how many times the Nth element of the first list should be counted. The calculator has no problems accepting zero or fractional numbers as frequencies. The third and fourth arguments don't actually have an application. Their intention is to divide the elements into several categories: the third list would indicate which category each element of the data list falls under, and the fourth list would be a list of categories. However, this was apparently never implemented, and adding these lists doesn't affect the output. # Error Conditions 230 - Dimension happens when either the data list is {}, or the frequency list only contains 0s. 240 - Dimension mismatch happens when the frequency list (or the category list) isn't the same length as the data list. 260 - Domain happens when the frequency list contains negative elements. # Related Commands # See Also Command Summary Checks the current mode settings. Command Syntax getMode(setting) Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The getMode() command checks any one current mode setting. Just give it the name of the mode setting to check, as a string, and it will give you the current value. For example: :getMode("Angle") "RADIAN" :getMode("Complex Format") "REAL"  The name of the setting is not case-sensitive, but is very typo-sensitive. In practice, getMode() is almost entirely superseded by setMode() — usually, you don't care about a setting unless you want to change it if it's wrong. In particular, it is silly to do the following: :If getMode("Angle")≠"RADIAN" : setMode("Angle","RADIAN")  In this case, just the setMode() command instruction by itself would have been fine, since changing the mode from radian to radian would've done nothing anyway. It is also silly to do the following: :getMode("Angle")→oldmode :setMode("Angle","RADIAN") ... :setMode("Angle",oldmode)  It is a noble impulse to try to preserve the old setting and restore it later. However, the same is accomplished more elegantly with (note the { } brackets): :setMode({"Angle","RADIAN"})→oldmode ... :setMode(oldmode)  # Optimization Every string like "Angle" or "FLOAT 12" can be replaced by a numerical equivalent (one that is, for some reason, still given as a string, e.g. "3" or "26"). Using these is shorter, and it has the benefit of being international. See the Table of Mode Settings to look up these numbers, as well as read about what the various mode settings do. # Error Conditions 260 - Domain error happens when a mode setting or value doesn't exist, at least not with this spelling. # Related Commands # See Also Command Summary Seeds the random number generator. Command Syntax RandSeed value Menu Location • Press 2nd MATH to enter the MATH popup menu. • Press 7 to enter the Probability submenu. • Press 6 to select RandSeed. This command works on all calculators. 2 bytes The RandSeed command seeds the random number generator. The value you use should be a positive integer: the sign and any decimals will be simply ignored. To explain what this means, first you have to understand how pseudo-random number generators work. Every time a command like rand() is called the calculator gives a different number — this means that the calculator must keep some variable around that changes when rand() is called. This variable is called the seed. Generating a random number is done as follows: 1. To get the number itself, apply some function that takes the seed to a real number between 0 and 1 (for a simple rand() call). 2. If a different type of random number is needed (e.g. a random integer), the real number 0..1 is adjusted in some way. 3. The seed itself is updated by some carefully chosen mathematical operation. "Seeding" the random number generator means setting the seed to some specific value. This is done for two reasons: • To ensure randomness, you might seed the random generator with the current time — that way, it's guaranteed to be different every second of every day. • Every time you seed the random number generator with a specific number, the random numbers that follow will be the same. For example, the following output is guaranteed to be the same on all calculators every time (except for formatting): :RandSeed 100 :rand() .556077 :rand() .590054  # Advanced Uses Seed the RNG with the current time by using the following command: :RandSeed startTmr()  The random number generator is very popular as an encryption method to implement on calculators. This is done as follows: 1. Use the encryption key as a random number seed. 2. Do something to the text to be encrypted that involves random numbers (e.g. a randomly generated One-Time Pad) 3. To decrypt, use the encryption key as a seed, and reverse the operation above. Most of the security of this method lies in the obscurity of the random number generator. Someone that has read this page (or someone from Texas Instruments) could break the code in a matter of seconds on a computer; and if they knew anything at all about the message, they could probably break the code with just a calculator. In general, after you mess with the random number seed, you must 'restore randomness' somehow — otherwise, every time you run that program, random numbers will be the same afterwards every time. Using startTmr() as above is one way of doing so; another is generating a random integer before you run RandSeed, and using it as the seed at the end. For example: :rand(10^10) →r :RandSeed 0 (code with predictable random numbers) :RandSeed r  # The RNG Algorithm The algorithm used by the calculator to generate random numbers is known as L'Ecuyer's algorithm. This particular implementation works as follows. The following constants are used: :2147483563→mod1 :2147483399→mod2 :40014→mult1 :40692→mult2  RandSeed n is equivalent to the following code: :abs(int(n))→n :If n=0 Then : 12345→seed1 : 67890→seed2 :Else : mod(mult1*n,mod1)→seed1 : mod(n,mod2)→seed2 :EndIf  rand() is equivalent to the following code: :Local result :mod(seed1*mult1,mod1)→seed1 :mod(seed2*mult2,mod2)→seed2 :(seed1-seed2)/mod1→result :If result<0 : result+1→result :Return result  # Related Commands Command Summary Returns a list of calculator configuration info. Command Syntax getConfg() Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 3 bytes The getConfg() command returns a list of useful and not-so-useful information about the calculator. Every other entry in the list is a description of the next entry, so it's not too hard to figure out which entry you need if necessary. The values returned by getConfg() are: List position Value List position Value 1 "Product Name" 2 "Advanced Mathematics Software" 3 "OS Version" 4 "version #, date" 5 "Product ID" 6 string unique to calculator model 7 "ID #" 8 string unique to specific calculator 9 "Screen Width" 10 160 or 240 11 "Screen Height" 12 100 or 128 13 "Window Width" 14 varies (see Note 1.) 15 "Window Height" 16 varies (see Note 1.) 17 "RAM Size" 18 depends on model 19 "Free RAM" 20 varies (see Note 2.) 21 "Archive Size" 22 depends on model 23 "Free Archive" 24 varies Notes: 1. The window width and window height depend on calculator model and on the split screen setting. They're also off by varying amounts. It's best to use one of the other settings to determine calculator type (widescreen or standard), and getMode() to determine split screen status if necessary. 2. Even with all variables deleted, Free RAM will be considerably less than RAM Size, due to operating system variables taking up that much of it. There are several interesting applications for getConfg(). One is compatibility with other calculator models: • If you want to make graphics compatible, use Screen Width or Screen Height to check if you're on a widescreen calculator. • If you want to use an advanced OS feature, check the OS Version. • If you use lots of features of your calculator model and think it won't work on any other, check Product ID and exit if it doesn't match your own. Another application: if your program is very memory-intensive, you might want to make sure that there is enough free RAM to fit all the variables you will need. The same is, in theory, true for the archive, but having little archive memory available is rare. Using the ID #, you might detect when the program has been transferred to a different calculator, and react accordingly (e.g. re-initialize certain variables). A more subtle application: supplying a number calculated from the ID # as the random number seed will ensure that your program always behaves in the same way for the same calculator, but will be different on different calculators — this might be completely inappropriate in some cases, but an interesting gimmick in others! # Related Commands # See Also Command Summary Gives the ASCII code of a character. Command Syntax ord(string) Menu Location • Press 2nd MATH to enter the MATH popup menu. • Press D to enter the string submenu. • Press B to select ord(. This command works on all calculators. 2 bytes The ord() command gives the ASCII code of a character (that is, its character code, which is a modification of standard ASCII). The input is meant to be a single character, but the command doesn't actually check for that — so in practice, it gives the ASCII code of the first character in a string. You can convert multiple characters at once by giving ord() a list (or matrix) of characters. The inverse of ord() is char(), which converts a character code to a character. :ord("America") 65 :ord({"A","b","c"}) {65 98 99} :ord("") 0  # Optimization Code such as :inString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",str)  should be replaced by appropriate use of ord(); in this case, :ord(str)-64  # Related Commands # See Also Member RSA is a popular encryption algorithm. It is a public-key algorithm — this means that anyone can encrypt messages using the "public key", but only the person who knows the "private key" can decrypt them. The security of RSA relies on factoring large numbers being difficult. Unfortunately, numbers that would be large enough to be secure are also too large for the calculator to handle. Any key you could generate on a calculator could be broken on a computer in a matter of minutes or hours, depending on the length. This program is a good example of a number-theoretic algorithm implemented on 68k calculators. # The Code rprime(a,b) :Func :Local p :a+rand()(a-b)→p :p+mod(p,2)+1→p :Loop : If isPrime(p) : Return p : p+2→p :EndLoop :EndFunc  extgcd(a,b) :Func :Local q,r :{1,0,a}→a :{0,1,b}→b :While b[3]>0 : intDiv(a[3],b[3])→q : a-q*b→r : b→a : r→b :EndWhile :a :EndFunc  rsakey(nbits) :Func :Local m,p,q,d,e :intDiv(nbits,2)→nbits :rprime(2^nbits,2^(nbits+1))→p :rprime(2^nbits,2^(nbits+1))→q :(p-1)(q-1)→m :1+rand(m-2)→e :While gcd(e,m)>1 : 1+rand(m-2)→e :EndWhile :extgcd(m,e)[2]→d :{e,d,p*q} :EndFunc  rsa(txt,e,n) :Func :txt/txt→result :While e>0 : If mod(e,2)=1 : mod(result*txt,n)→result : mod(txt^2,n)→txt : intDiv(e,2)→e :EndWhile :result :EndFunc  # An Explanation The code for this program is divided into four parts. Two of them are necessarily independent: rsakey() is used to generate a public and private key, and rsa() is used to encrypt or decrypt. The other two functions could easily be part of rsakey(); they're isolated here for clarity, and because they're somewhat useful on their own; rprime() generates a random prime, and extgcd() is the extended Euclidean Algorithm. First, here is a description of how RSA works. To generate the key: 1. We find two large primes P and Q, and find N=PQ which will be used as a modulus. Let M=(P-1)(Q-1). 2. Take a random integer E, 1<E<M, which has no divisors in common with M. 3. Find E's inverse mod M: an integer D such that DE ≡ 1 mod M. 4. The pair (E,N) is the public key, and (D,N) is the private key. To encrypt text: 1. Divide it into blocks which are encoded as integers A, 1<A<N. 2. Compute A^E mod N for each block, giving the encrypted version of that block. To decrypt text, encrypt it using D instead of E. It's a basic result in number theory that if N and M are defined as above, then AM≡ 1 mod N. This means that (AE)D = ADE ≡AM+1≡A mod N. Therefore the decryption actually does reverse the encryption. We could find D from E easily because we know M, which depends on knowing P and Q. However, someone who knows just the public key only knows N=PQ; to get P and Q from there, he'd need to factor N, which is hard. This means that someone who doesn't know D can't easily find it, and the encryption is secure. ## The rprime() function This is by far the most time-consuming part of the entire algorithm. Fortunately, it only has to be done to generate a key, and keys are reusable. Still, the key generation could easily take a minute or two as a consequence. The purpose of rprime() is to generate a prime number between its two arguments (i.e. rprime(1,100) generates a random prime between 1 and 100). In practice, it can end up overflowing past the upper bound, but this is very unlikely, especially for the ranges RSA deals with. The idea is simple: a+rand(a-b)→p generates a random number between a and b to start at. The next line makes sure this starting point is odd. From there, we keep testing the number to see if it's prime; if it's not, we increase it by 2 and try again. ## The extgcd() function The extended Euclidean Algorithm not only computes the GCD of a and b, but finds two constants M and N such that M*a+N*b=GCD(a,b) — this has lots of applications, only one of which is RSA. The idea is similar to the standard Euclidean Algorithm to compute GCD. Initially, we can express a as 1*a+0*b, and b as 0*a+1*b. After that, each time we take a remainder, we can express it as a sum of a and b. The final remainder is the GCD, giving us the M and N above. ## The rsakey() function The first part of the code is easy: we generate the random primes P and Q. Each of them has half the bits that N should, since multiplying them will approximately add the number of bits. The next few lines just follow the algorithm outlined earlier. Note that to get a random number relatively prime to M, we just keep picking numbers until the GCD is 1. This shouldn't take a long time, since most numbers are relatively prime to M (if factoring is hard, accidentally factoring should be even harder). The only tricky part is that we use extgcd() to find D. The reason this works is the following: If DE≡1 mod M, then D*E=k*M+1 for some k, so D*E-k*M=1. This is just the equation that the extended Euclidean Algorithm solves! (note that GCD(E,M)=1). ## The rsa() function This function should work equally well for encrypting lists and single numbers. We'll assume that txt is a single number for simplicity, but every operation used distributes over lists, so a list would work the same way. The exponentiation routine is not the For loop you'd expect. This would be terribly slow, since E is, on average, around 2127 for a 128-bit modulus. Instead, we use the following logic: • If E is even, then computing AE is the same as computing (A2)E/2. • If E is odd, then AE=A*AE-1, for which the first bullet applies. Therefore, every loop, we do the following: • If E is odd, then we multiply A into the result, and we're left with the task of computing AE-1. • Now E is even no matter what, so we square A and divide E by 2. To prevent the numbers from getting too large, we take mod() ahead of time with every product. Command Summary Takes the sine of a number (usually, an angle). Command Syntax sin(angle) Menu Location Press the SIN button to enter sin(. This command works on all calculators. 1 byte The sin() command returns the sine of an angle measure. Naturally, the result depends on the angle mode the calculator is in: radian, degree, or (in AMS version 3.10) gradian. You can also use one of the r, °, G marks to specify an angle mode. For many common angles, sin() can compute an exact result. Other angles, the calculator will leave alone unless it's in approximate mode (or unless you make it approximate), and then it will give a decimal approximation. As long as the calculator is in radian mode, sin() can be used with complex numbers as well. :sin(30°) 1/2 :sin(x+2π) sin(x) :sin(πi/2) sinh(π/2)*i  If sin() is applied to a list, it will take the sine of every element in the list. # Advanced Uses The sin() of a matrix is not (in general) the same as taking the sine of every element of the matrix. A different definition is used to compute the result; see Matrices and Their Commands. It requires the matrix to be square and diagonalizable in order to apply. # Error Conditions 230 - Dimension happens when taking sin() of a matrix that isn't square. 260 - Domain error happens when taking sin() of a complex number in degree or gradian mode. 665 - Matrix not diagonalizable happens when taking sin() of a matrix that isn't diagonalizable. # Related Commands  Jul 24 — To bring the excitement of wiki editing to all visitors, a progress bar was added to the home page. Command Summary Takes the cosine of a number (usually, an angle). Command Syntax cos(angle) Menu Location Press the COS button to enter cos(. This command works on all calculators. 1 byte The cos() command returns the cosine of an angle measure. Naturally, the result depends on the angle mode the calculator is in: radian, degree, or (in AMS version 3.10) gradian. You can also use one of the r, °, G marks to specify an angle mode. For many common angles, cos() can compute an exact result. Other angles, the calculator will leave alone unless it's in approximate mode (or unless you make it approximate), and then it will give a decimal approximation. As long as the calculator is in radian mode, cos() can be used with complex numbers as well. :cos(60°) 1/2 :cos(x+2π) cos(x) :cos(πi/2) cosh(π/2)  If cos() is applied to a list, it will take the cosine of every element in the list. # Advanced Uses The cos() of a matrix is not (in general) the same as taking the cosine of every element of the matrix. A different definition is used to compute the result; see Matrices and Their Commands. It requires the matrix to be square and diagonalizable in order to apply. # Error Conditions 230 - Dimension happens when taking cos() of a matrix that isn't square. 260 - Domain error happens when taking cos() of a complex number in degree or gradian mode. 665 - Matrix not diagonalizable happens when taking cos() of a matrix that isn't diagonalizable. # Related Commands Command Summary Inverts a point on the graph screen. Command Syntax PtChg x, y Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The PtChg command inverts a point on the graph screen — drawing it if it isn't already there, and erasing it otherwise. It uses point coordinates, which means that the result is determined by window variables: the x-coordinate must be between xmin and xmax, and the y-coordinate must be between ymin and ymax (with (xmin,ymin) being the bottom left and (xmax,ymax) the top right corner). Unlike pixel commands such as PxlChg, however, PtChg won't give an error if the coordinates happen to be outside these bounds — it simply won't have any effect. # Advanced Uses PtChg can also be used with two lists of the same size. In that case, it will invert the points for every pair of elements (xlist[n], ylist[n]). This can be used as an alternative to plots (see NewPlot) to plot a set of points. # Related Commands Command Summary Erases a point on the graph screen. Command Syntax PtOff x, y Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The PtOff command erases a point on the graph screen. It uses point coordinates, which means that the result is determined by window variables: the x-coordinate must be between xmin and xmax, and the y-coordinate must be between ymin and ymax (with (xmin,ymin) being the bottom left and (xmax,ymax) the top right corner). Unlike pixel commands such as PxlOff, however, PtOff won't give an error if the coordinates happen to be outside these bounds — it simply won't have any effect. # Advanced Uses PtOff can also be used with two lists of the same size. In that case, it will erase the points for every pair of elements (xlist[n], ylist[n]). # Related Commands Command Summary Draws a point on the graph screen. Command Syntax PtOn x, y or PtOn {x1, x2, x3}, {y1, y2, y3} Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The PtOn command draws a point on the graph screen. It uses point coordinates, which means that the result is determined by window variables: the x-coordinate must be between xmin and xmax, and the y-coordinate must be between ymin and ymax (with (xmin,ymin) being the bottom left and (xmax,ymax) the top right corner). Unlike pixel commands such as PxlOn, however, PtOn won't give an error if the coordinates happen to be outside these bounds — it simply won't have any effect (exactly the same as the 83+ version of Pt-On). # Advanced Uses PtOn can also be used with two lists of the same size. In that case, it will draw the points for every pair of elements (xlist[n], ylist[n]). This can be used as an alternative to plots (see NewPlot) to plot a set of points. # Related Commands Command Summary Changes a pixel on the graph screen. Command Syntax PxlChg row, column Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The PxlChg command inverts a pixel on the graph screen: drawing it if it was erased, and erasing it otherwise. It uses pixel coordinates, which means that the result isn't affected by window variables like xmin and xmax: PxlChg P, Q will always change the pixel P rows down and Q columns across from the top left corner of the graph screen. The range of possible values (anything outside this range will give an error) is: • 0..76 for the row and 0..158 for the column, on a TI-89 or TI-89 Titanium. • 0..102 for the row and 0..238 for the column, on a TI-92, TI-92 Plus, or Voyage 200. Note that this doesn't match the output of getConfg() — the command is reliable for figuring out which of the two situations you're in, but the values it gives for window width/height are incorrect. When in split screen mode, PxlChg still won't give an error as long as the values are in the regular range, but drawing a pixel off the screen will have no effect. The output of getConfg() will reflect the change in window size, but the values themselves still won't be correct. In practice, PxlChg is the most useful of the pixel-toggling commands, because it can be used both to draw and to erase pixels. # Advanced Uses PxlChg can also be used with two lists of the same size. In that case, it will change the pixels for every pair of elements (rowlist[n], collist[n]). This is a rarely-used alternative to a command like XorPic, with the one advantage that it doesn't require a picture variable (of course, if you had two such lists, you could easily use NewPic to create a picture variable). # Error Conditions 260 - Domain error happens when the pixel coordinates are not in the allowed range. # Related Commands Command Summary Turns off a pixel on the graph screen. Command Syntax PxlOff row, column Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The PxlOff command erases a pixel on the graph screen. It uses pixel coordinates, which means that the result isn't affected by window variables like xmin and xmax: PxlOff P, Q will always erase the pixel P rows down and Q columns across from the top left corner of the graph screen. The range of possible values (anything outside this range will give an error) is: • 0..76 for the row and 0..158 for the column, on a TI-89 or TI-89 Titanium. • 0..102 for the row and 0..238 for the column, on a TI-92, TI-92 Plus, or Voyage 200. Note that this doesn't match the output of getConfg() — the command is reliable for figuring out which of the two situations you're in, but the values it gives for window width/height are incorrect. When in split screen mode, PxlOff still won't give an error as long as the values are in the regular range, but erasing a pixel off the screen will have no effect. The output of getConfg() will reflect the change in window size, but the values themselves still won't be correct. # Advanced Uses PxlOff can also be used with two lists of the same size. In that case, it will erase the pixels for every pair of elements (rowlist[n], collist[n]). This is a rarely-used alternative to a command like AndPic, with the one advantage that it doesn't require a picture variable (of course, if you had two such lists, you could easily use NewPic to create a picture variable). # Error Conditions 260 - Domain error happens when the pixel coordinates are not in the allowed range. # Related Commands Command Summary Turns on a pixel on the graph screen. Command Syntax PxlOn row, column Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The PxlOn command turns on a pixel on the graph screen. It uses pixel coordinates, which means that the result isn't affected by window variables like xmin and xmax: PxlOn P, Q will always turn on the pixel P rows down and Q columns across from the top left corner of the graph screen. The range of possible values (anything outside this range will give an error) is: • 0..76 for the row and 0..158 for the column, on a TI-89 or TI-89 Titanium. • 0..102 for the row and 0..238 for the column, on a TI-92, TI-92 Plus, or Voyage 200. Note that this doesn't match the output of getConfg() — the command is reliable for figuring out which of the two situations you're in, but the values it gives for window width/height are incorrect. When in split screen mode, PxlOn still won't give an error as long as the values are in the regular range, but drawing a pixel off the screen will have no effect. The output of getConfg() will reflect the change in window size, but the values themselves still won't be correct. # Advanced Uses PxlOn can also be used with two lists of the same size. In that case, it will turn on the pixels for every pair of elements (rowlist[n], collist[n]). This is a rarely-used alternative to a command like RclPic, with the one advantage that it doesn't require a picture variable (of course, if you had two such lists, you could easily use NewPic to create a picture variable). # Error Conditions 260 - Domain error happens when the pixel coordinates are not in the allowed range. # Related Commands I have the engine for drawing maps and storing data sort of done. This is an RPG game that deals with controlling armies in a strategic fashion to accomplish goals. There isn't much of a storyline yet. "Please excuse my dear Aunt Sally" —Anonymous To figure out order of operations, the calculator divides all the operations into 15 priority levels. When evaluating an expression, everything on one priority level is simplified (usually, going from left to right) before moving on to the next. Of course, everything inside parentheses, brackets, and braces is simplified first.  Priority Level Operations on that level 1 Everything inside parentheses ( ), brackets [ ], and braces { } 2 Indirection (#)1 3 Function calls: everything with its own parenthesis, e.g. sin() 4 Operators that go after their operand, e.g. T This also includes taking elements from lists and matrices with [ ] 5 Exponentiation (^, .^)2 6 Negation (-) 7 String concatenation (&) 8 Multiplication and division (*, /, .*, ./) 9 Addition and Subtraction (+, -, .+, .-) 10 Equality relations: (=, ≠, >, ≥, <, ≤) 11 Logical and arithmetic not3 12 Logical and arithmetic and 13 Logical and arithmetic or, xor 14 Constraint "with" operator (|) 15 Store (→) The OS version 2.07 update introduced several commands for dealing with times and dates. Some of these rely on the built-in clock, while others are used for formatting. TI-84+ programmers will not find many differences in function here — these commands were added to both calculator series at the same time, and are almost exactly the same. The only difference is the addition of the getTmZn() and setTmZn() commands, and the absence of a days-between-dates command. ## Low-Level Commands • startTmr() — This command returns the current value of a timer that is updated every second when the clock is enabled. This value doesn't correspond to any actual time, but can be used with checkTmr() to get a time difference. • checkTmr() — checkTmr(t) is equivalent to startTmr()-t. This can be used to get the time elapsed since startTmr was used. • ClockOn, ClockOff — Enables or disables the hardware clock. • isClkOn() — Tests if the clock is enabled or not. ## Time Commands • setTime() — Sets the current time, in hours, minutes, and seconds. If the clock is enabled, this time will be updated every second. • getTime() — Returns the current time as the list {hours, minutes, seconds}. This command is unaffected by time format. • setTmFmt() — Sets the time format - 12 hour, or 24 hour. • getTmFmt() — Returns this time format setting. • getTmStr() — Returns the current time as a string, affected by time format (though you can override it with an optional argument). • setTmZn() — Sets the current time zone, as an offset (in minutes) from GMT. • getTmZn() — Returns the current time zone. ## Date Commands • setDate() — Sets the current date (year, month, and day). If the clock is enabled, this date will be updated as needed. • getDate() — Returns the current date as the list {year, month, day}. This command is unaffected by date format. • setDtFmt() — Sets the date format - 1 for month/day/year, 2 for day/month/year, or 3 for year/month/day. • getDtFmt() — Returns this date format setting. • getDtStr() — Returns the current date as a string, affected by date format (though you can override it with an optional argument). ## Time/Date Manipulation • timeCnv() — Converts a number of seconds into a list of {days, hours, minutes, seconds} representing the same time lapse. • dayOfWk() — Returns the day of week (Sunday through Saturday encoded as 1 through 7) of a specified date. Calculators are built with one primary purpose: math. Programming, game playing, and everything else is secondary. Thus, you will find a number of powerful math commands. Although it may seem that they are of no use to a programmer, programs sometimes need math functions, and many math functions can be used in clever ways. In this guide we'll group the commands into the following five categories: # Algebra Symbolic manipulation is the primary cool factor of the 68k (TI-89, TI-92, TI-92+, and V200) calculators. With the solve() command, the calculator can give exact solutions to a fair number of equations (of course, approximate solutions are even easier to get). Along with a dozen variations on solve(), there are a few commands for extracting various parts of an expression, which should be useful for writing your own algebraic tools. As on earlier calculator models, there's also logs and complex number operations, which are even better with symbolic math. Here is the complete list of algebraic commands: # Arithmetic For basic arithmetic, the 68k calculators' advantage is that it can do exact calculations with integers up to 256255-1 (and approximate floating-point decimal calculations up to 101000-1). Here is the complete list of arithmetic commands: # Calculus What with the ability for symbolic calculation, the 68k calculators are much more useful for calculus than other models; they can do symbolic differentiation and integration, as well as calculate infinite sums and products. There are some numeric functions as well carried over from earlier calculator models. Here is the complete list of calculus commands: # Statistics Statistics is the one field in which the 68k calculators don't stand out compared to other TI models. In fact, there are considerably less statistical tools than, say, on the TI-83 series calculators (compare their page on statistics). What there is left is mostly a variety of regression models: For all of these, use the ShowStat command to display the results in a dialog box, and look at the statistical system variables for more information. There are also some general-purpose commands for sample statistics: Finally, you can plot data with the NewPlot command (see also PlotsOn and PlotsOff). # Trigonometry The main thing to remember when doing trig is to be aware of what angle mode you're in. By default, you're using radians, where a full circle measures 2π. The other two angle modes are degrees, where a full circle is 360, and (on the newest OS versions for the TI-89 Titanium and Voyage 200) "gradians" where a full circle measures 400. The commands that actually work with these include the usual trig functions (half of which — the mostly useless half — were added in OS version 2.07) and their inverses, as well as commands to convert rectangular coordinates (x,y) into polar coordinates (r,θ). There's also the hyperbolic functions (there's a hyperbolic equivalent for each of the normal trig functions). As far as symbolic math is concerned, you can use tExpand() and tCollect() to rearrange complicated expressions using sin() and cos(), and hope to simplify them somewhat by doing so. The entire list of trig commands is: I am working on the program, but I am having some troubles with the packet format. I wish this was easier. # Basic Greyscale Most people do not know that greyscale can be achieved outside of a extra ASM library like Xlib, greyscale is nothing more than a pixel flashing on and off so quickly that it apperas to be grey. The con of greyscale in Basic is that it can give ERR:MEMoRY when you are using a delay, furthermore, only one grey can be achieved. For instance this hardcoded "block" Repeat 0 Pxl-Change(31,47 Pxl-Change(31,48 Pxl-Change(31,49 Pxl-Change(30,47 Pxl-Change(30,48 Pxl-Change(30,49 Pxl-Change(29,47 Pxl-Change(29,48 Pxl-Change(29,49 Pxl-Change(28,47 Pxl-Change(28,48 Pxl-Change(28,49 End  this very simple code will switch the pixels on and off rapidly, a delay could be added using a "for(" loop. Command Summary Runs code stored inside a string. Command Syntax expr(string) Menu Location • Press MATH to enter the MATH popup menu. • Press D to enter the Strings submenu. • Press 2 to select expr(. This command works on all calculators. 2 bytes The expr() command runs code stored inside a string: for instance, expr("5→x") has the same effect as 5→x. The main use of expr() is with user input: the input you get from some commands comes in a string, and you might use expr() to convert it back to a number. The other advantage of using expr() is that you can paste together code as the program is running, to run something you couldn't possibly have put in the program ahead of time. For instance, you might paste together a Dialog..EndDlog block whose elements might be different every time you run the program. :expr("5→x") 5 :expr("25") 25  The expr() command is somewhat limited in what it is allowed to do. For instance, if a string contains a variable name, expr() of that string returns the value of that variable; to refer to the variable itself, use the # (indirection) operator. Another limitation is that expr() cannot contain commands that aren't allowed on the home screen, even if you're running it from a function or program. For example, Local will cause an error in expr(). Finally, in some respects expr() is actually running in its own program. It will still be able to access local variables from outside the expr(), but Lbl and Goto are limited — you can't jump out of expr() with them, nor can you jump in. # Advanced Uses It's best to use expr() sparingly. Characters inside a string are ignored during tokenization, so they will take up more space than actual commands, and there will be a short delay before the code inside expr() can run. This also causes problems with language localization. Normally, once a command is tokenized, it will work in any language. However, with expr(), code is tokenized on the spot, so it will depend on the language being the same. If your program was written using English language localization, it will not work for someone who's working in German, Spanish, or French. # Error Conditions 550 - Invalid outside function or program happens when the string contains commands that need to be inside a function or a program to work. # Related Commands Finished! Not Finished I finally got the TI to receive bytes, and am working on parameter data right now.  Joined Jul 22 — DJ Omnimaga does not match any existing user name Time Zone: Not given Finished the basic platform engine, complete with these features: Seamless double character maps; Fast drawing; Jumping/moving; parabolic jumping curves; ceiling hit detection Serenity is a RPG style platform game, set in space. You are the captain of a simple cargo ship, traveling through space carrying unknown Government cargo, when your ship is attacked by space pirates! Now you will need to explore the bowels of their ship, fight off enemies, and gain special items, so you can finally escape. Command Summary Finds a search string in another string. Command Syntax inString(string, search-string,[) Menu Location • Press 2nd MATH to enter the MATH popup menu. • Press D to enter the Strings submenu. • Press 6 to select inString(. This command works on all calculators. 3 bytes The inString() command searches for one string inside another, starting from the beginning and going forward. If it finds the string, it returns the position where it finds it. If it doesn't find the string, it returns 0. If the string is there multiple times, it will only find the first one. Optionally, you can also give inString() a starting position. In that case, it won't find any occurrences of the strings earlier than that position. :inString("Chop shops stock chops.","hops") 7 :inString("Chop shops stock chops.","hops",8) 20 :inString("Chop shops stock chops.","stocks") 0  # Related Commands Add an update! The ListPages module does not work recursively. Any more-or-less complicated program will probably end up using a list at some point: they are the easiest way to organize a set of similar information. This article's purpose is to teach you to do so intelligently: list operations can be slow, and it's not always intuitive what the better approach even is. The general idea of list optimization is that performing an operation on an entire list at once is good. Suppose that 'list' is a list variable containing a hundred elements. Consider this simple operation: :list+1→list  With one line of code, this performs a mathematical operation on one hundred numbers at once. The size of the program goes way down if you can do something like this. It's fast, too: we've delegated going through the list to some internal calculator routine, which can do it much faster than a TI-Basic command. The following sections are, in a sense, merely examples of situations in which this logic leads to a dramatic improvement in speed. Reading these and understanding not only what the optimizations are but how they work should give you an intuitive idea of what's slow and what's fast when working with lists. # Avoid For Loops Specifically, avoid using For loops to go through every element of a list, whenever possible. The operation list[index] takes an increasing amount of time to run as the index increases, because the calculator is forced to go through the whole list to get to the element you want. If you have just one list[index] inside the For loop, you're going through half the list, on average, in each cycle of the loop. And you're probably doing an operation that would only require going through the list once! As an example, consider this rather intuitive routine for checking if a list contains an element: :check1(list,val) :Func :Local i :For i,1,dim(list) : If list[i]=val : Return true :EndFor :Return false :EndFor  The For loop in this routine is exactly the sort of thing you should avoid whenever possible. Instead, consider this routine: :check2(list,val) :product(list-val)=0  This routine approaches the problem in a very non-intuitive way: first, the value we're looking for is subtracted from each element; then, the elements are all multiplied together. If the value we're looking for was present in the list, then one of the elements in the product will be 0, making the whole expression 0. The first thing you'll notice is that the second routine is much smaller. But, perhaps not quite so obviously, it's a great deal faster as well. Even for a list with 10 elements, the second routine is, on average, 3 times faster to finish running. For a list of 100 elements, the second routine is a whopping 12 times faster! In addition, the second routine is consistent. The first routine varies from very quick (if the element is the first in the list) to very slow (if the element is not in the list at all). The second routine takes the same amount of time in all cases. Similar results hold true for every For loop that goes through a list. Although the optimization doesn't always end up being smaller, it's always faster, especially for large lists. # Use newList() instead of seq() This seems like a nonsensical suggestion because newList() and seq() are very different commands. About the only thing they have in common is that they both return a list. How can one replace the other? Half of the answer here is that one particular instance of seq() can be rewritten using newList() for a massive speed boost. The optimization is this: :seq(i,i,1,n) can be :cumSum(1+newList(n))  The first line of code uses seq() to generate the list {1, 2, 3, …, n}. The second does the same thing differently: newList(n) gives us {0, 0, …, 0}. Adding 1 to this list gives {1, 1, …, 1}. Finally, taking the cumulative sum results in {1, 2, 3, …, n}. The second part of the answer is that 90% of the time, any other use of seq() can be reduced to this one, because of the way most operations distribute over lists. Consider this contrived, convoluted example: :seq(tan(√(100-x^2)),x,1,10) can be :tan(√(100-seq(x,x,1,10)^2))  This is a good idea to do in any case, because applying an operation to an entire list at once is faster than doing it to an element many times. However, in this case, it also means that the newList() optimization above can be used here as well: :tan(√(100-seq(x,x,1,10)^2)) can be :tan(√(100-cumSum(1+newList(10))^2))  In some case, you might have to tweak the limits of the evaluation a bit. If the seq() starts at 0, not 1, for instance, you might subtract 1 from the cumSum(1+newList(n)) result. Using the | (with) operator, it's possible to make this optimization into a truly brainless process: :seq(<FOO>,x,1,n) can be :f(cumSum(1+newList(n)))|f(x)=<FOO>  If the optimization is possible at all, this setup will do the trick. Here are some reasons it might not work: • Some operation in <FOO> doesn't distribute. E.g. if <FOO> is isPrime(x), you'll get a domain error. • Part of <FOO> is random. In this case, seq() will generate n random numbers, but newList() will only generate one. The reason that this optimization works can be explained with a "factory line" metaphor. The seq() command treats each case individually: like assembling 100 cars by first making the first one, then the second one, and so on. The newList() version applies each command to an entire list at once: this is the Industrial Revolution, where we assemble 100 cars by first making 100 hulls, then adding 100 motors, 100 doors, and so on. A final, minor note: if you're trying to make a sequence of the same length as an existing list, then 0*list is faster than newList(dim(list)). # Working with Logical Lists A list of logical values such as {true, false, true, true, false} is a strange animal. First of all, it's not always easy to get one when you need it. Say you want to know which elements of a list are over 100. Unfortunately, this code does not work: :list>100→ispos  Instead, you'll get the laconic answer "false". This probably translates to "You dummy, that thing there on the left is a list, and the one on the right is a number. It's like comparing apples and oranges!" Unlike virtually every other operation there is, the relational operators =, , >, , <, and don't distribute over lists. The trick here is to change the comparison to one that involves two lists. To do this, add 0*list to one side. :list>100+0*list→ispos  Now, we're comparing two lists, so things start to make sense again. We're not out of the woods yet, however. Once you have a logical list, what do you do with it? There are three common situations: • We want to know if all of the elements are true. • We want to know if any of the elements are true. • We want to find the index of the first true element. The first situation is actually default behavior, of sorts. You can stick a logical list in a condition for If or when(). If all of the elements of the list are true, the condition will be interpreted as true. Otherwise, the 'false' branch (if there is one) will be taken. For instance: :If list>100+0*list Then : Disp "Everything is over 100!" :Else : Disp "Some elements are 100 or under..." :EndIf  The second situation boils down to the first with a little trick, which is to negate the list (using not, or simply reversing the condition). Then use an If or when(), but reversing the two branches. If the true branch is taken, that means that all of the negated elements are true, so all of the original elements were false. If the false branch is taken, that means some of the negated elements are false, so at least one of the original elements must have been true. If you want to get a single truth value ahead of time, use the when() command as follows: :Define alltrue(list)=when(list,true,false) :Define anytrue(list)=when(not list,false,true)  The third situation is the trickiest one. From two sections up, we know using a For loop (which would be simple to write) is a no-no. Here is a decent alternative… to be honest, though, it's not that great either, being really ugly. The search for a better one is still on! :Define first(list)=intDiv(k+inString(string(list),string(true)),k+1)|k=dim(string(false))  …Yes, this routine turns the entire list to a string, searches it for the word "true", then uses this to find the answer. You might replace k and k+1 by 5 and 6 respectively if you're not worried about language localization (the Spanish would be alright, but not the Germans with "falsch" nor the French with "faux"). Technica: Clash of the Forces is a story about a post-apocalyptic world. NINA. It was our first version of AI. We made it analytical. Logical. Able to make decisions and rationale based on external stimuli. We made it smart where we weren't and then some. Is it a surprise that it's now out of control? I am the last Scientist on the planet Earth. And, I have the strangest ability. By constantly exchanging my mechanical parts, I can never rust. What? Thought I was human? Command Summary Returns a list filled with zeroes. Command Syntax newList(length) Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 1 byte The newList() command returns a list of a specific length that is filled entirely with zeroes. :newList(3) {0 0 0} :newList(5) {0 0 0 0 0} :newList(0) {}  This can be easily expanded to returning a list filled with any value: to return a list filled with a value x, just add x to the result of newList(). This works for strings as well, since "Hello"+0 simplifies to "Hello". # Advanced Uses newList() can be used for making a comparison between a single value and a list. Normally, something like {1,2,3,4}=2 simply returns "false", since 2 is not a list and {1,2,3,4} is. To do a comparison element-by-element, use newList() to turn the single value into a list: in this case, 2+newList(4). Comparing {1,2,3,4} to 2+newList(4) will return {false, true, false, false} (you might use when() to get a single value out of this list). This works to extend other operations to a number and a list, as well, though comparisons are the most useful application of this technique, since most operations already work this way. # Optimization In many cases, an expression with newList() can be used to optimize a seq() command. First, observe that the simple :seq(k,k,1,n)  which will return the list {1,2,3,…,n}, can be replaced by :cumSum(1+newList(n))  The result is about twice as fast. This is useful because many seq() expressions can be expressed using something like seq(k,k,1,n). For example: :seq(k^2,k,1,n) can be :seq(k,k,1,n)^2 which is :cumSum(1+newList(n))^2  This rearrangement is not always possible, but when it is, it gives a significant improvement in speed, with no real difference in size. Here is a more complicated example (which is a sequence of probabilities with the binomial distribution). Notice the use of the with operator. :seq(nCr(n,k) p^k (1-p)^(n-k),k,1,n) can be :nCr(n,a) p^a (1-p)^(n-a)|a=cumSum(1+newList(n))  # Error Conditions 260 - Domain error happens when the length is not an integer ≥0. # Related Commands Command Summary Jumps to a label somewhere else in the program. Command Syntax :Goto label-name Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The Goto command jumps to a label (declared with the Lbl command) somewhere else in the program — either before or after the Goto, it doesn't matter. The label has to be in the same program as the Goto — you can't jump into another program. If there are several labels with the same name, the Goto command will only find the first. Virtually everyone critiques the Goto command for being unnecessary and encouraging bad coding habits. The argument is that it makes code hard to read: if you see a 'Goto x' somewhere in the program, you have to search through the entire program to find out where to continue reading. And most of the things that Goto is used for can be done better using commands like If, While, Cycle, etc. TI seems to agree, because they didn't even bother putting Goto and Lbl in the program editor toolbar. That being said, it is sometimes (very rarely) a good idea to use Goto. A good example is a situation when you need to exit several loops at once (this can't be done with the Exit command, which only exits one loop). A note for TI-83 series programmers: the issue of memory leaks from improper use of the Goto command does not occur on 68k calculators. The 68k TI-Basic parser doesn't use a stack to keep track of loops and If blocks entered: instead, End statements have a link back to what it is they're matching. This means that nothing special happens if a Goto jumps out of a loop: the calculator doesn't even know it's inside a loop except at the end when it has to do the looping. The 68k calculators have their own bit of unexpected Goto behavior: code like expr("Goto x") will not work. This is because the code that expr( runs is treated as though it were inside its own program, so you can't jump out of that program into the program that it's actually in. # Optimization The Cycle and Exit commands perform tasks that you might otherwise use Goto for. By all means, use these command instead if you can: they work much faster, since they don't have to look through the entire program for the label (in fact, they don't have to look at all — they already know where to jump). # Error Conditions 500 - Invalid label happens when the label doesn't exist (in this program). # Related Commands Command Summary Marks a point in the program for use with Goto and Toolbar..EndTBar. Command Syntax :Lbl label-name Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes (plus 1-10 bytes for label name) The Lbl command is used to mark a point in the program to which the Goto command or selections from a Toolbar..EndTBar menu can jump. When jumping to a label, the calculator will start searching the program from the beginning to find the label. The same limitations are imposed on a label name as on a variable name. It's okay to have a label with the same name as a variable, though, this won't cause problems. You can, theoretically, have labels in the same program with the same name, but only the first one will be used (the calculator will always find it before it finds the others). Labels don't extend beyond a program: you can't jump to a label inside a different program or function. Also, the code inside an expr() string lives in its own program as far as labels are concerned: if you put a label in it, the main program won't find it; you can't jump out of a routine run with expr() into the main program; finally, you don't have to avoid the label names that the main program uses. # Error Conditions 500 - Invalid label happens when the label name uses an invalid character. # Related Commands Command Summary Substitutes a value for a variable temporarily. Command Syntax expression Menu Location Press the This command works on all calculators. 1 byte The | operator (which nobody seems to know how to pronounce, although TI suggests "with") temporarily sets a variable to some value, just for a single evaluation. For example: :x^2+2x+1|x=5 6  Using the | operator doesn't actually affect the value of the variable. However, it will work both if the variable is undefined, and if the variable already has a different value. Only one | can occur in a single expression: if you have more, this will either cause an error or ignore all but the first substitution, depending on placement. However, one | is enough for any number of variables: just separate the values to use with and: :x+y|x=2 and y=2 4  # Advanced Uses The | operator has a more complicated use: rather than giving a specific value for a variable, you might give a condition (or several conditions) for its value, using the >, , <, and operators. This condition will be used if it helps simplify the expression, especially with solve(). For instance: :abs(x)|x<0 -x  Weird things can happen if you do this to a variable whose value is already defined, however: :5→x 5 :abs(x)|x<0 |undef|  # Optimization If a complicated expression has a repeating element, you may be able to make the calculation smaller and faster by replacing this repeating element with a variable, for which you substitute the correct value. For example (here the repeating element is √(1-x^2)): :x√(1-x^2)+tanֿ¹(x/√(1-x^2)) can be :x*a+tanֿ¹(x/a)|a=√(1-x^2)  A related trick is to make a substitution with a function, for an operation that has to be done several times in a single line. For example: :a*(a-1)/2+b*(b-1)/2+c*(c-1)/2 can be :f(a)+f(b)+f(c)|f(x)=x*(x-1)/2  # Error Conditions 200 - Constraint expression invalid happens when the condition doesn't make sense to the calculator. # Related Commands Command Summary Stores a value to a variable. Command Syntax valuevariable Menu Location Press the STO> key to insert →. This command works on all calculators. 1 byte The operator assigns a value to a variable. Initially, a variable such as 'x', 'lastname', or 'cube' is undefined. When used in an expression, they will be treated as unknowns: 3*x-x may be simplified to 2*x, but will otherwise be left alone. Once a value is assigned to a variable, that value will be substituted for the variable every time you use it. For example, you might store 5→x. Now, if you write 3*x-x, the answer won't be 2*x, but 10. Any kind of value — a simple number, an expression, a string, list, or matrix, or even a function can be stored to a variable with →. The following are all valid: :5→x 5 :"Alighieri"→lastname "Alighieri" :n^3→cube(n) Done  As a special case, you can even store to a single element of a list or matrix. For example: :{1,2,3,4,5}→list {1 2 3 4 5} :99→list[3] 99 :list {1 2 99 4 5}  # Advanced Uses Using the # (indirection) operator, you can store a value to a variable given its name, in a string. # Optimization There are alternatives to such as Define or CopyVar; they have their uses in special situations, but is better (smaller and easier to understand) in other cases. # Error Conditions 190 - Circular definition happens when an undefined variable is given a value in terms of itself (e.g. x+1→x). # Related Commands Command Summary Stores a value in a variable. Command Syntax Define variable=value Menu Location Starting in the program editor: • Press F4 to enter the Var menu. • Press 1 or Enter to select Define. This command works on all calculators. 2 bytes The Define command sets the value of a variable. At its simplest, it's an alternative to : Define x=5 is equivalent to 5→x. However, Define is also useful for defining functions or programs using Func..EndFunc or Prgm..EndPrgm respectively, which can't do: :Define key()=Func : Local k : Loop : getKey()→k : If k≠0 : Return k : EndLoop :EndFunc  # Advanced Uses Using Define to create functions or programs is very useful when inside a program. If your program uses its own subroutines to perform simple tasks (such as the key-reading program above), you can define these subroutines inside the program itself, keeping everything in one file (it might be good to make them Local or use DelVar to delete them afterwards). Subroutines are useful for organizing a large program. # Error Conditions 190 - Circular definition happens when defining a variable (other than a recursive function or program) in terms of itself. # Related Commands Information is sufficient and basic. Perhaps all the assembly pages should be combined. http://tibasicdev.wikidot.com/asmshells Assembly Command Summary Exits a loop. Command Syntax :Exit Menu Location Starting in the program editor: • Press F2 to enter the Control menu. • Press 8 to enter the Transfers submenu. • Press 5 to select Exit. This command works on all calculators. 4 bytes The Exit command immediately exits from a For..EndFor, Loop..EndLoop, or While..EndWhile loop. The program continues running from the instruction after the EndFor, EndLoop, or EndWhile. Exit is especially useful for Loop..EndLoop, because the loop won't ever end if you don't give it a reason to. For example: :Loop : Input "Number 1-100",num : If 1≤num and num≤100 : Exit : Disp "Number out of range!" :EndLoop  Often, a Loop..EndLoop block with an Exit inside it isn't a very good idea, because it can be replaced by a While..EndWhile block. However, in the example above, there is a difference: the condition for exiting the loop is not checked at the beginning. A While..EndWhile loop that did the same thing would have to initialize the num variable first. If there are multiple loops, one nested inside the other, the Exit command only exits out of the innermost one. The Exit command can also be used to exit a sub-routine (very helpful when using subroutines on a 'skeleton' during development) # Optimization Although Goto can also be used to exit out of a loop, the Exit command is faster: it knows where the end of the loop is, but a Goto command has to search through the entire program to find its label. However, the Goto command is more versatile, since it can jump anywhere in the program, not just immediately after the loop. In particular, Goto can be used to exit multiple loops at once. # Error Conditions 560 - Invalid outside Loop..EndLoop, For..EndFor, or While..EndWhile blocks happens when the Exit command is not inside a loop. # Related Commands This page has good reference material, but it is short. It should be combined with other assembly pages. http://tibasicdev.wikidot.com/asmlibs Assembly; Reference We don't really need to document the "why" of hex codes; that should be meant for greater assembly tutorials. This page has too much to be combined with other assembly pages. There is not much information on hex codes themselves such as where the code comes from or how the calc interprets them. http://tibasicdev.wikidot.com/hexcodes Assembly Command Summary Prematurely ends a cycle of a loop. Command Syntax :Cycle Menu Location Starting in the program editor: • Press F2 to enter the Control menu. • Press 8 to enter the Transfers submenu. • Press 3 to select Cycle. This command works on all calculators. 4 bytes The Cycle command ends the current cycle of a For..EndFor, Loop..EndLoop, or While..EndWhile loop, as though the corresponding End were there. It doesn't exit the loop forever; if the loop would have repeated, it goes back to the beginning. However, if the loop is ready to end (if the counter is equal to the end value, for a For loop, or if the condition is false, for a While loop), it exits the loop and continues after the EndFor or EndWhile command. An example of Cycle in a For loop: :For num,1,100 : If isPrime(num) : Cycle : Disp num :EndFor  This loop prints all the composite numbers between 1 and 100. Here's how it works: for every number, it first checks whether or not it's prime. If it is, the program goes back to the beginning of the loop with the next number. On the other hand, if the number is composite, the program continues to the Disp command, then hits EndFor and goes back to the beginning of the loop as well. If the Cycle instruction is inside multiple loops, one nested in the other, it works with the innermost loop. # Error Conditions 560 - Invalid outside Loop..EndLoop, For..EndFor, or While..EndWhile blocks happens when Cycle is used outside a loop. # Related Commands This is obviously an introduction to assembly. Since this site is not dedicated to such a language, its improvement isn't as urgent. I think it might need to be combine with the other assembly pages. http://tibasicdev.wikidot.com/assembly Advanced; Assembly Command Summary Generates a random number. Command Syntax rand() or rand(n) Menu Location • Press 2nd MATH to enter the MATH popup menu. • Press 7 to enter the Probability submenu. • Press 4 to paste rand(. This command works on all calculators. 2 bytes The rand() command generates a random number. It can be used in one of two ways: • rand() gives a random real number between 0 and 1. • rand(n) gives a random integer between 1 and n. By adding or multiplying appropriately, you can change these bounds. For example, 10rand() gives a random real number between 0 and 10, and rand(9)-5 gives a random number between -4 and 4. L'Ecuyer's algorithm is used by TI calculators to generate pseudorandom numbers. :RandSeed 0 :rand() .943597402492 :rand() .908318860975 :rand(10) 2  # Advanced Uses Using the RandSeed command makes the random numbers entirely predictable: after setting the random seed to some value, the same random numbers will be returned every time. # Error Conditions 260 - Domain error happens when the maximum number is 1014 or greater. # Related Commands Command Summary Creates a custom toolbar menu. Command Syntax :Custom (list of titles and items) :EndCustm Menu Location Starting in the program editor: • Press F2 to enter the Control menu. • Press 7 to select Custom…EndCustm. This command works on all calculators. 2 bytes for Custom; 2 bytes for EndCustm. A Custom..EndCustm block creates a custom toolbar menu. The menu can have up to eight tabs for the F1 .. F8 keys, each with any number of sub-items. The contents of the menu are defined using the Title and Item commands inside the Custom..EndCustm block. The Title command indicates a new tab, so you can have up to eight of these. After Title, put a string to use as the label for the tab. If the title has no items, you'll be able to select the title itself to insert this label somewhere. The Item command indicates an item under the most recent tab — you can have as many items under a tab as you like, or none at all. This also takes a string that will be used as the label for the item, and will be inserted any time you select that item from the menu. Here is an example of the syntax: :Custom : Title "Animals" : Item "Dog" : Item "Cat" : Title "Rocks" : Title "Plants" : Item "Grass" : ... :EndCustm  In this case, the custom toolbar will display | F1 Animals | F2 Rocks | F3 Plants | … |. Pressing F1 would bring up the Animals menu with items 1:Dog and 2:Cat. Then, pressing 1 or ENTER would insert Dog after the cursor. Pressing F2 would insert Rocks under the cursor since that tab has no items. The custom toolbar can be accessed in any window. To switch to the custom toolbar or back, press 2nd CUSTOM (or use the CustmOn and CustmOff commands). The calculator comes with a default custom menu, which is overwritten whenever you create one of your own. To restore it, select F6 - Clean Up from the home screen toolbar, and select 3:Restore custom default. This also lets you see an example of Custom..EndCustm syntax. A related command is Toolbar..EndTBar. It also displays a custom menu, but can only be used in a program, and the entries of the menu jump to other parts of the program. # Error Conditions 450 - Invalid in a function or current expression happens when Custom..EndCustm is used in a function. 460 - Invalid in {{Custom}}..{{EndCustm}} block happens when anything other than Title or Item appears in the block. 590 - Invalid syntax block happens when the syntax is somehow wrong, e.g. if there are more than 8 tabs. # Related Commands Command Summary Returns the variable type of a variable Command Syntax getType(variable) Menu Location This command can't be found in any menu besides the command catalog. This command works on all calculators. 2 bytes The getType() command returns the type of a variable — number, string, function, etc. The output is a short string encoding the type of the variable. :5→x :getType(x) "NUM" :{1,2,3}→x :getType(x) "LIST" :DelVar x :getType(x) "NONE"  The specific values that getType() can return are: • "DATA" for a data variable • "EXPR" for a symbolic expression • "FUNC" for a function • "LIST" for a list • "MAT" for a matrix • "NONE" for an undefined variable • "NUM" for a number • "OTH" for an unknown variable type (usually assembly-related) • "PIC" for a picture • "PRGM" for a program • "STR" for a string • "TEXT" for a text file Keep in mind that getType() cannot test the type of an expression, only a variable — so getType("Hello!") for example is invalid. # Advanced Uses If possible, avoid comparing the result of getType() to an actual string. The risk here is that when the calculator is switched to a different language, the output of getType() changes language too. This is only a minor consideration. But if you already have a variable of the right type lying around, and you want to test an unknown variable, compare their getTypes(). For example: :{1,2,3}→knownlst :If getType(unknown)="LST" can be :{1,2,3}→knownlst :If getType(unknown)=getType(knownlst)  This is occasionally, but not always, a size optimization as well, if the known variable has a short name. Since getType() returns a result even for undefined variables, it can be used as a replacement for isVar(), which unlike getType() isn't present on all 68k calculator models. # Error Conditions 140 - Argument must be a variable name happens when the argument is not a variable name. # Related Commands Command Summary Displays a dialog box for input or output. Command Syntax :Dialog (dialog elements) :EndDlog Menu Location Starting in the program editor: • Press F3 to enter the I/O menu. • Press 1 to enter the Dialog submenu. • Press 5 to paste Dialog..EndDlog. This command works on all calculators. 2 bytes for Dialog; 2 bytes for EndDlog. A Dialog..EndDlog block is used to display a dialog box that can be used for input, output, or both. There are several commands that can be used inside Dialog..EndDlog to determine its content: • At most one Title instruction (to add a title). • Text (to add a line of text). • Request (to add a text entry box). • DropDown (to add a drop-down menu). Except for the Title instruction, you can mix and match any number of these (as many as will fit on the screen), and their order will determine the order they are displayed. Finally, two "buttons" labeled Enter=OK and ESC=CANCEL will be displayed at the bottom of the dialog box. Here is a typical dialog box to input a variable name: :Dialog : Title "Load file" : Request "File name", name : Text "(include folder name if not ""main"")" :EndDlog  # Advanced Uses The system variable "ok" will detect if Enter or ESC was used to exit the dialog: it will have a value of 1 if Enter was used, and 0 for ESC. This is particularly important when you're looking for input. If ESC is used, then the variables used in Request or DropDown will not be changed from what they were before (if they were undefined, they will remain undefined). It's probably a good idea to detect that sort of thing. # Error Conditions 230 - Dimension happens when the dialog would be too wide or too tall to fit on the screen. 470 - Invalid in Dialog..EndDlog block happens when instructions other than Title, Text, Request, DropDown are used. 590 - Invalid syntax block happens when something miscellaneous goes wrong, e.g. there is more than one Title. 730 - Missing start or end of block syntax happens when the Dialog is missing its EndDlog, or vice versa. # Related Commands # See Also This technique code example is a very simple random polynomial generator. The randPoly( function automatically creates a random polynomial of a given degree, however, the polynomial is not promised to be factorable. This routine will generate a factorable polynomial of a given degree using simple string manipulation. # The Code factprac(deg) Prgm rand(deg)→b "1"→str For a,1,b str&"(x+rand(20)-10)"→str EndFor Pause expand(expr(str)randPoly(x,deg-b)) EndPrgm  # Explanation The routine uses three variables, deg, b, and str. First, the user defines deg initially which is the degree of the random polynomial. Using the rand( command, the routine selects a number between one and deg. This is stored into b. This will be the number of rational roots the random polynomial will have. The next part, including the For loop, is what makes the polynomial factorable. Here is the excerpt: "1"→str For a,1,b str&"(x+rand(20)-10)"→str EndFor  What we are wanting to do is create a string that represents the polynomial in factored form, for example (x+3)(x-2). We initialize the string (which is str) with a "1" since that will not interfere with the math later1. The For loop loops the number of rational roots we want determined by b. Each time the loop goes through, another factor is created and is combined with the current string with the & command. Finally, it is time to display the creation. We use the Pause command because for higher degree polynomials, the resulting polynomial might run off the screen. Pause expand(expr(str)randPoly(x,deg-b))  str is the string of factors, however, this number of factors will probably not be sufficient for the degree wanted since b might be less than deg. We therefore multiply the string with a random polynomial generated by randPoly( in order to achieve the desired degree. expr( turns the string into an expression that can be worked with. Finally, expand( will expand the factored polynomial into standard form. The resulting polynomial can then be used for practice or something. The routine is meant to make a polynomial that can be factored, but perhaps not entirely factorable. If you want a program that generates a fully factorable polynomial, play with the code a little and try to figure it out! # Application This routine demonstrates minor string manipulation. This shows how you can use various string commands, such as & and expr( in order to accomplish a task. It also demonstrates how to initialize a string depending on the purpose of the result. # Alternative A downside to the above code is that it will only intentionally yield integer roots. The code below will also yield fractional rational roots, occasionally: factprac(deg) Prgm "1"→str rand(deg)→b For a,1,b If rand(10)-5≤0 Then "("→c Else "((rand(5)+1)"→c EndIf str&c&"x+rand(20)-10)"→str EndFor Pause expand(expr(str)randPoly(x,deg-b)) EndPrgm  Command Summary Repeats a block of code as long as a condition is met Command Syntax :While condition (block of code) :EndWhile Menu Location Starting in the program editor: • Press F2 to enter the Control menu. • Press 5 to paste While..EndWhile. This command works on all calculators. 2 bytes for While; 4 bytes for EndWhile. A While..EndWhile block is used to repeat a block of code as long as some true-or-false condition is met. This condition is checked before entering the loop (if it's false to begin with, the loop is skipped), and checked again every time the loop ends. For example: :1→x :While x<5 : x+1→x : Disp x :EndWhile 1 2 3 4  The condition is not checked anywhere in the middle of the loop. If the condition becomes temporarily false, but then becomes true again before the end, the loop keeps going. What kind of conditions are possible? Any command that returns a logical value — true or false — is acceptable. This includes the results of: • Relational operators: =, , >, , <, and • Logical operators: and, or, xor, not • Any advanced test command: pxlTest(), isPrime(), and others. • A variable that contains one of the values true or false, or a function that returns them. Of course, these can also be combined: for example, isPrime(x) and x≠2 is a valid condition. One common use of a While loop is to wait for a key to be pressed: :0→key :While key=0 : getKey()→key :EndWhile  # Optimization In most programming languages a loop that always keeps repeating would be created using a While loop with a condition that's always true. You can do this in TI-Basic too, but it's simpler to use Loop..EndLoop which does the same thing. :While true : © do something :EndWhile can be :Loop : © do something :EndLoop  # Error Conditions 20 - A test did not resolve to TRUE or FALSE happens when the condition is indeterminate, or the wrong data type. 730 - Missing start or end of block syntax happens when a While is missing an EndWhile, or vice versa. # Related Commands Command Summary Repeats a block of code forever. Command Syntax :Loop (block of code) :EndLoop Menu Location Starting in the program editor: • Press F2 to enter the Control menu. • Press 6 to paste Loop..EndLoop. This command works on all calculators. 2 bytes for Loop; 4 bytes for EndLoop. A Loop..EndLoop block is used to make the code inside the Loop repeat forever. For example, the following code will keep printing "Hello!" until you break out of the program with the ON key or the calculator runs out of batteries: :Loop : Disp "Hello!" :EndLoop Hello! Hello! Hello! ...  Generally, Loop isn't used just like that, because having to end a program with the ON key lacks style. There are two ways to break out of the loop: • using Goto, you can jump to somewhere else in the program. • using Exit, you can exit the loop, continuing the program immediately after the EndLoop command. Generally, using Exit is considered more stylish — and it's easier to read the code, because you don't have to search the entire program for the Goto's matching label. # Error Conditions 730 - Missing start or end of block syntax happens when the Loop is missing an EndLoop, or vice versa. # Related Commands Command Summary Repeats a block of code some number of times. Command Syntax :For counter, start, end, step (block of code) :EndFor Menu Location Starting in the program editor: • Press F2 to enter the Control menu. • Press 4 to paste For..EndFor. This command works on all calculators. 3 bytes for the For command; 4 bytes for EndFor. A For..EndFor block is used to repeat the code inside the block some number of times. To specify the number of times to repeat this code, a counter variable is specified, along with a starting value and an ending value. The variable will be set to the starting value, then increased until it gets to the ending value, running the code inside the block each time. For example: :For count, 1, 5 : Disp count :EndFor 1 2 3 4 5  You can also give a step size by which to increase the counter (the default is 1). In the above example, if the first line were changed to ":For count, 1, 5, 2" then the block would only run with count=1, then with count=3, then with count=5. You can even make the step size negative and decrease the counter from a maximum to a minimum (e.g. "For count, 5, 1, -1"). For loops are most useful when you want to look at every element of a list or matrix individually. For example, the following code will "do something" (depending on what you replaced the comment with) to every element of "list" in order: :For i, 1, dim(list) : © do something with list[i] :EndFor  To look at every element of a matrix, you'd have to use two For loops, one inside the other: :For i, 1, rowDim(matrix) : For j, 1, colDim(matrix) : © do something with matrix[i, j] : EndFor :EndFor  # Advanced Uses The counter variable can be manipulated inside the For loop to produce different results. For example, the following code will count from 1 to 10 but skip 3: :For i, 1, 10 : If i=3 : i+1→i : Disp i :EndFor  What happens is that when the code runs for the third time, with i=3, the If statement increases i to 4. From there, the For loop thinks it's business as usual, and the next cycle will be done with i=5, then i=6, and so on. Another way to manipulate the progress of a For loop is with the Cycle and Exit commands (which apply to all loops). You can also use the Goto command to jump out of a For loop, but this is considered poor programming in most cases. # Optimization In many cases, the For loop is not the best choice when working with lists — sometimes, the operation can be done on the whole list at the same time, which is both smaller and faster. For example: :For i, 1, dim(list) : list[i]+1→list[i] :EndFor can be :list+1→list  When using For to create a list from scratch, the seq() command is a smaller and faster alternative. For example: :For i, 1, 10 : i^2→list[i] :EndFor can be :seq(i^2, i, 1, 10)→list  # Error Conditions 260 - Domain error happens when the step size is 0. 730 - Missing start or end of block syntax happens when the For is missing an EndFor, or vice versa. # Related Commands Command Summary Gets a variable given its name as a string. Command Syntax #var-name Menu Location On a widescreen calculator, press 2nd # to paste #. Or, on any calculator model, press: • 2nd CHAR to enter the CHAR popup menu. • 3 to enter the Punctuation submenu. • 3 again to paste #. This command works on all calculators. 2 bytes The # operator takes a string containing a variable name, such as "x", and gives you the variable itself. This can be used to get the value of that variable (kind of like a weaker version of expr()), but the # operator really shines when you need to refer to the variable itself: storing to it, for example. 5→expr("var") will give you an error. 5→#"var", however, will work. :"x"→str :5→#str 5 :x 5 :DelVar #str :x x  You'll see # called the "indirection" operator (for instance, in the command catalog). This is because using # is an indirect way of accessing a variable's value: you don't have the variable itself to work with, just its name. # Advanced Uses The # command is particularly useful for dealing with picture variables, if you don't know the exact name of the picture ahead of time. For example, you might have two pictures, called 'cat' and 'dog', that you need to display depending on whether x=1 or x=2. This can be done with an If command, but that gets more and more complicated as you add pictures. On the other hand, you can always do this: :{"cat","dog"}→pics :RclPic #(pics[x])  The # command is necessary here because RclPic and commands like it want the actual picture variable as an argument, not a string with its name; expr() wouldn't work either because it would try to find the value of 'cat', and get an error. Whenever you're dealing with external files created by someone else (such as external levels for a game), you don't know the variable names ahead of time, so you'll need the # operator. For the example of an external level, you would first input the variable name of the level into a string variable (say, the variable 'level'). Then you can use '#level', just as you would a regular variable, to refer to it. # Optimization In many cases, both # and expr() will do the same thing. In these cases, it's still better to use #, because it's faster. # Error Conditions 360 - Indirection string is not a valid variable name happens when the string used with # isn't allowed as a variable name (e.g. longer than 8 characters). # Related Commands Command Summary Raises a number to a power. Command Syntax base ^ exponent Menu Location Press the [^] key to paste ^. This command works on all calculators. 1 byte The ^ operator is used to raise a number (the base) to a power (the exponent) — x^y is "pretty-printed" as xy. When the exponent is a positive integer, this is equivalent to multiplying the base by itself that many times. When the base is a real number, the result will always be a real number if possible: for example (-1)^(1/3) will return -1. Some powers will return a complex number because there is no real number answer (or give an error, if the calculator is in real number mode). When the base is a complex number, the result will be the principal branch. For lists, the ^ operator works componentwise — x^{a,b,c,…} will return {x^a,x^b,x^c,…}, {x,y,z,…}^a will return {x^a,y^a,z^a,…}, and two lists of the same length will be matched up element by element. :2^4 16 :(-1)^(1/2) i :0^0 undef  Typing [2nd] [LN] or [♦] [LN] also pastes e^( — this is not a separate command (unlike the TI-83 series), and just uses the ^ operator to do its work. It is, however, the simplest way to type the constant e. A minor quirk of the ^ operator is that if it's present multiple times in one expression, it is evaluated right to left (unlike most commands, which are evaluated left to right). For example, x^y^z will be interpreted as x^(y^z) rather than (x^y)^z. The reason this is done is that (x^y)^z can easily be rewritten as x^(y*z), so there's no need for two powers. x^(y^z) can't be rewritten that way. Therefore, it's much more meaningful to interpret x^y^z as x^(y^z). # Advanced Uses The ^ operator can be used as an alternative to an "xth root" operator, which the 68k calculators don't have. If you want to take the Nth root of a number, raise it to the 1/N-th power instead. The ^ operator is also useful for square matrices. Raising a square matrix to an integer power between -32768 and 32767 just multiples the matrix by itself, taking the inverse first for negative matrices. A matrix to the 0th power is the identity. For raising a matrix to a fractional power, or raising a number to a matrix power, a different definition is used: see Matrices and Their Commands. This definition is in fact compatible with the repeated-multiplication method, except that it is far more general. None of these situations are equivalent to applying ^ to every element of a matrix. For that, see the .^ command. # Error Conditions 230 - Dimension happens when non-square matrices are used with ^. 230 - Domain error happens when a matrix is raised to an integer power not in the range -32768..32767. 665 - Matrix not diagonalizable happens when diagonalization (used to compute most uses of ^ with matrices) fails. 800 - Non-real result happens when there is no real result to return, and the calculator is in real number mode. 890 - Singular matrix happens when raising a matrix with no inverse to a negative power. # Related Commands • * (multiply) • / (divide) # See Also Member Recommendations Link here Not Categorized Reference material it seems. http://tibasicdev.wikidot.com/ascii-codes Reference; Calculator  Jul 14 — A Guide to ASM is being made, its work in progress though. # UNDER CONSTRUCTION As a prevential procedure this document has been taken off by its author. It will be reuploaded once completed IF the big scary admins here agree with it. Matthias  Jul 14 — Today a page on keyhooking has been added, its still incomplete though. here is the page # Keyhooks in Assembly First of all, it's important to know that Texas Instruments does not support keyhooks. Secondly, notice that this is an advanced topic; you can of course read this, but in order to let it prove useful to you, it is best if you understand Assembly quite well or are at least knowledgeable with its terms. With that said, let's dive into it! Every piece of keyhooking code begins with this add a, e ;This byte is not being run but it ensures that the pointer is valid in order to prevent ;it from randomly executing some code.  Hooks are controlled by flags, which are located in IY+33 and in IY+36, and both of them have a RAM area consisting of four bytes. Each of those RAM areas contains the "little endian" (process the low bits first and then the high bits) pointer to the hook, then a page number, and last but not least, a byte that can be used as safe RAM for that hook. An example of a hook is the GetKeyHook; this hook is enabled using b_call$4F7B


and disabled using
b_call 4F7E  more information on Keyhooks can be found here Member Member Member Scroll DOWN to locate CSS: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>TI-Basic Developer: The Calculators</title> <script type="text/javascript" src="http://static.wikidot.com/v--33/common--javascript/init.combined.js"></script> <script type="text/javascript"> // global request information var WIKIREQUEST = {}; WIKIREQUEST.info = {}; WIKIREQUEST.info.domain = "tibasicdev.wikidot.com"; WIKIREQUEST.info.siteId = 405; WIKIREQUEST.info.categoryId = 2265; WIKIREQUEST.info.themeId = 49; WIKIREQUEST.info.requestPageName = "thecalcs"; OZONE.request.timestamp = 1241040762; OZONE.request.date = new Date(); WIKIREQUEST.info.lang = 'en'; WIKIREQUEST.info.pageUnixName = "thecalcs"; WIKIREQUEST.info.pageId = 14764; WIKIREQUEST.info.lang = "en"; OZONE.lang = "en"; // window.onload = WikidotInit(); </script> <meta http-equiv="content-type" content="text/html;charset=UTF-8"/> <meta http-equiv="content-language" content="en"/> <script type="text/javascript" src="http://static.wikidot.com/v--33/common--javascript/WIKIDOT.combined.js"></script> <style type="text/css" id="internal-style"> @import url(http://static.wikidot.com/v--33/common--modules/css/monetize/textlinkads/MonetizeTextLinkAdsModule.css); @import url(http://static.wikidot.com/v--33/common--theme/base/css/style.css?0); /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* GLOBAL CLASSES */ a { text-decoration: none;} a:hover { background-color: transparent; text-decoration: underline; } .infobox a { color: #FFF;} /* SPECIFIC*/ #container { min-width: 700px;} #header { margin: 0 0 2em;} #header h1, #header h2 { display: none;} #header-extra-div-1 { position: absolute; top: 0px; left: -4px; height: 7em; background-image: url(http://tibasicdev.wikidot.com/local--files/logo/Logo11.PNG); background-repeat: no-repeat; background-position: center left; background-color: #33a661; border: 5px solid #33a661; border-top: none; border-left: none; -moz-border-radius-bottomright: 32px; -webkit-border-bottom-right-radius: 45px; width: 50%; z-index: 1; transparency: 50%; } #header-extra-div-2 { position: absolute; top: 0px; left: 50%; width: 7em; height: 3em; background: #33a661; z-index: 2; } #header-extra-div-3 { position: absolute; top: 0px; right: 0px; height: 3.5em; background: #FFF; border: 4px solid #33a661; border-bottom: none; border-right: none; -moz-border-radius-topleft: 45px; -webkit-border-top-left-radius: 45px; width: 50%; z-index: 3; } #top-bar { position: absolute; top: 7.5em; right: 0em; background-color: #a8f0c3; height: 20px; z-index: 4; border: 1px solid #a8f0c3; border-bottom: none; border-right: none; -moz-border-radius-topleft: 10px; -webkit-border-top-left-radius: 10px; -moz-border-radius-bottomleft: 10px; -webkit-border-bottom-left-radius: 10px; } #top-bar a:hover { text-decoration: none; height: 17px; } #top-bar a, #top-bar li ul li a { background-color: #a8f0c3; color: #000; } #top-bar li ul { border: 1px solid #a8f0c3;} #top-bar li { width: 12em;} #side-bar { float: left; width: 13em; padding: 0 .5em; margin: 0; margin-top: 1em; border: 4px solid #a8f0c3; border-left: none; -moz-border-radius-topright: 45px; -webkit-border-top-right-radius: 45px; } #side-bar a { margin: 0; display: block; padding-left: 1em; border-bottom: 1px solid #D2D3C6; color: #1E2B31; } #side-bar .special-collapsible { border-top: 1px solid #D2D3C6; margin-left: -.5em; } #side-bar ul { border-top: 1px solid #D2D3C6; padding: 0; margin-left: -.5em; list-style: none; } #side-bar .top ul { border-top: none;} #main-content{ margin-left: 15em;} #page-content { } #footer { width: 95%; margin-left: auto; margin-right: auto; height: 16px; background-color: #33a661; border: 1px solid #33a661; -moz-border-radius-topleft: 8px; -webkit-border-top-left-radius: 8px; -moz-border-radius-bottomleft: 8px; -webkit-border-bottom-left-radius: 8px; -moz-border-radius-topright: 8px; -webkit-border-top-right-radius: 8px; -moz-border-radius-bottomright: 8px; -webkit-border-bottom-right-radius: 8px; } #footer a { color: #000;} /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ </style> <link rel="shortcut icon" href="/local--favicon/favicon.gif"/> <link rel="icon" type="image/gif" href="/local--favicon/favicon.gif"/> <link rel="alternate" type="application/wiki" title="Edit this page!" href="javascript:WIKIDOT.page.listeners.editClick()"/> <script type="text/javascript" src="http://static.wikidot.com/v--33/common--modules/js/misc/NewPageHelperModule.js"></script></head> <body id="html-body"> <div id="container-wrap"> <div id="container"> <div id="header"> <h1><a href="http://tibasicdev.wikidot.com/"><span>TI-Basic Developer</span></a></h1> <h2><span>The TI-Basic Information Repository</span></h2> <!-- google_ad_section_start(weight=ignore) --> <div id="search-top-box"> <form id="search-top-box-form" action="dummy"> <input id="search-top-box-input" class="text empty" type="text" size="15" name="query" value="search this site" onfocus="if(YAHOO.util.Dom.hasClass(this, 'empty')){YAHOO.util.Dom.removeClass(this,'empty'); this.value='';}"/><input class="button" type="submit" name="search" value="search"/> </form> </div> <div id="top-bar"> <ul><li>Membership <ul><li><a href="http://tibasicdev.wikidot.com/first-visit">First Time Visitor?</a></li><li><a href="http://tibasicdev.wikidot.com/conduct">Code of Conduct</a></li><li><a href="http://tibasicdev.wikidot.com/system:members">Site Members</a></li><li><a href="http://tibasicdev.wikidot.com/system:join">Become a Member</a></li><li><a href="http://tibasicdev.wikidot.com/system:invite">Invite a Friend</a></li></ul></li><li>Editing Pages <ul><li><a href="http://tibasicdev.wikidot.com/guide-to-editing">Guide to Editing</a></li><li><a href="http://tibasicdev.wikidot.com/conventions">Wiki Conventions</a></li><li><a href="http://www.wikidot.com/doc:wiki-syntax">Wiki Syntax</a></li><li><a href="http://tibasicdev.wikidot.com/to-do">To-Do List</a></li><li><a class="wiki-standalone-button" href="javascript:;" onclick="WIKIDOT.page.listeners.viewSourceClick(event)">View Page Source</a></li><li><a href="http://tibasicdev.wikidot.com/system:recent-changes">Recent Changes</a></li><li><a href="http://tibasicdev.wikidot.com/admin:manage">Site Manager</a></li></ul></li><li>Site Information <ul><li><a href="http://tibasicdev.wikidot.com/about">Site History</a></li><li><a href="http://tibasicdev.wikidot.com/logo">Site Logo</a></li><li><a href="http://tibasicdev.wikidot.com/all-news">News Archive</a></li><li><a href="http://tibasicdev.wikidot.com/news">83 News</a></li><li><a href="http://tibasicdev.wikidot.com/68k:news">68k News</a></li><li><a href="http://tibasicdev.wikidot.com/announcements">Announcements</a></li></ul></li><li>Related Sites <ul><li><a href="http://www.ticalc.org" onclick="window.open(this.href, '_blank'); return false;">ticalc.org</a></li><li><a href="http://www.unitedti.org" onclick="window.open(this.href, '_blank'); return false;">United-TI</a></li><li><a href="http://www.tifreakware.net/" onclick="window.open(this.href, '_blank'); return false;">TI-Freakware</a></li><li><a href="http://www.maxcoderz.org" onclick="window.open(this.href, '_blank'); return false;">MaxCoderz</a></li><li><a href="http://www.bgo.netfirms.com" onclick="window.open(this.href, '_blank'); return false;">BASIC Guru</a></li><li><a href="http://www.education.ti.com" onclick="window.open(this.href, '_blank'); return false;">Texas Instruments</a></li><li><a href="http://www.omnimaga.org" onclick="window.open(this.href, '_blank'); return false;">Omnimaga</a></li></ul></li></ul> </div> <div id="login-status"><span class="printuser"><a href="http://www.wikidot.com/user:info/james-kanjo" onclick="WIKIDOT.page.listeners.userInfo(35113); return false;" ><!--[if gte IE 7]><!--><img class="small" src="/common--images/avatars/35/35113/a16.png" alt="avatar" style="background-image:url(http://www.wikidot.com/userkarma.php?u=35113)"/><!--<![endif]--><!--[if lt IE 7]><img class="small" src="/common&#45;&#45;images/avatars/35/35113/a16.png" alt="avatar" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=35113,sizingMethod='scale')"/><![endif]--></a>James Kanjo</span> | <a href="http://www.wikidot.com/account:you">my account</a><a id="account-topbutton" href="javascript:;">&nabla;</a><div id="account-options"><ul><li><a href="http://www.wikidot.com/account:you">account summary</a></li><li><a href="http://www.wikidot.com/account:you/start/messages">private messages</a></li><li><a href="http://www.wikidot.com/account:you/start/contacts">my contacts</a></li><li><a href="http://www.wikidot.com/account:you/start/notifications">notifications</a></li><li><a href="http://www.wikidot.com/account:you/start/watching">watching</a></li><li><a href="javascript:;" onclick="WIKIDOT.page.listeners.logoutClick(event)">logout</a></li></ul></div></div> <div id="header-extra-div-1"><span></span></div><div id="header-extra-div-2"><span></span></div><div id="header-extra-div-3"><span></span></div> </div> <div id="content-wrap"> <div id="side-bar"> <div class="top"><ul><li><strong><a href="http://tibasicdev.wikidot.com/home">TI-83 Basic Home</a></strong></li><li><a href="http://tibasicdev.wikidot.com/68k:home">68k TI-Basic Home</a></li><li><a href="http://tibasicdev.wikidot.com/nspire">TI-Nspire Basic Page</a></li><li><a href="http://tibasicdev.wikidot.com/archives">Program Archives</a></li><li><a href="http://tibasicdev.wikidot.com/forum:home">Discussion Forums</a></li></ul></div><p><span style="font-size:large;">Preparation</span></p><ul><li><a href="http://tibasicdev.wikidot.com/thecalcs">The Calculators</a></li><li><a href="http://tibasicdev.wikidot.com/whytibasic">Why TI-Basic?</a></li><li><a href="http://tibasicdev.wikidot.com/using-this-guide">Using This Guide</a></li><li><a href="http://tibasicdev.wikidot.com/starter-kit">TI-Basic Starter Kit</a></li><li><a href="http://tibasicdev.wikidot.com/faq">TI-Basic FAQ</a></li></ul><p><span style="font-size:large;">Main Content</span></p><div class="special-collapsible"><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Commands</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Commands</a></div><div class="collapsible-block-content"><div class="list-pages-box"> <ul> <li><a href="http://tibasicdev.wikidot.com/commands">Overview</a></li> <li><a href="http://tibasicdev.wikidot.com/command-index">Command Index</a></li> <li><a href="http://tibasicdev.wikidot.com/geometpdf">Random command!</a></li> </ul> </div> <ul><li><a href="http://tibasicdev.wikidot.com/homescreen">Home Screen</a></li><li><a href="http://tibasicdev.wikidot.com/graphscreen">Graph Screen</a></li><li><a href="http://tibasicdev.wikidot.com/math">Math Functions</a></li><li><a href="http://tibasicdev.wikidot.com/variables">Variables</a></li><li><a href="http://tibasicdev.wikidot.com/userinput">User Input</a></li><li><a href="http://tibasicdev.wikidot.com/operators">Operators</a></li><li><a href="http://tibasicdev.wikidot.com/linking">Calculator Linking</a></li><li><a href="http://tibasicdev.wikidot.com/controlflow">Controlling Flow</a></li></ul></div></div></div><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Development</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Development</a></div><div class="collapsible-block-content"><ul><li><a href="http://tibasicdev.wikidot.com/development">Overview</a></li><li><a href="http://tibasicdev.wikidot.com/plan">Planning</a></li><li><a href="http://tibasicdev.wikidot.com/portability">Portability</a></li><li><a href="http://tibasicdev.wikidot.com/usability">Usability</a></li><li><a href="http://tibasicdev.wikidot.com/setup">Program Setup</a></li><li><a href="http://tibasicdev.wikidot.com/code-conventions">Code Conventions</a></li><li><a href="http://tibasicdev.wikidot.com/techniques">Techniques</a></li><li><a href="http://tibasicdev.wikidot.com/comments">Commenting Code</a></li><li><a href="http://tibasicdev.wikidot.com/subprograms">Subprograms</a></li><li><a href="http://tibasicdev.wikidot.com/cleanup">Program Cleanup</a></li><li><a href="http://tibasicdev.wikidot.com/debug">Debugging</a></li><li><a href="http://tibasicdev.wikidot.com/optimize">Optimization</a></li><li><a href="http://tibasicdev.wikidot.com/timings">Code Timings</a></li><li><a href="http://tibasicdev.wikidot.com/documentation">Writing Program Documentation</a></li><li><a href="http://tibasicdev.wikidot.com/marketing">Marketing</a></li><li><a href="http://tibasicdev.wikidot.com/releasing-your-program">Releasing Programs</a></li><li><a href="http://tibasicdev.wikidot.com/creating-new-program-versions">Creating New Program Versions</a></li></ul></div></div></div><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Techniques</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Techniques</a></div><div class="collapsible-block-content"><ul><li><a href="http://tibasicdev.wikidot.com/techniques">Overview</a></li><li><a href="http://tibasicdev.wikidot.com/animation">Animation</a></li><li><a href="http://tibasicdev.wikidot.com/assembly">Assembly</a></li><li><a href="http://tibasicdev.wikidot.com/compression">Compression Techniques</a></li><li><a href="http://tibasicdev.wikidot.com/cryptography">Cryptography</a></li><li><a href="http://tibasicdev.wikidot.com/custommenus">Custom Menus</a></li><li><a href="http://tibasicdev.wikidot.com/custominput">Custom Text Input</a></li><li><a href="http://tibasicdev.wikidot.com/easy-map-making">Easy Map Making</a></li><li><a href="http://tibasicdev.wikidot.com/friendly-window">Friendly Graphing Window</a></li><li><a href="http://tibasicdev.wikidot.com/graphics">Graphics</a></li><li><a href="http://tibasicdev.wikidot.com/grouping">Grouping A Program</a></li><li><a href="http://tibasicdev.wikidot.com/highscores">Highscores</a></li><li><a href="http://tibasicdev.wikidot.com/lookuptables">Look-Up Tables</a></li><li><a href="http://tibasicdev.wikidot.com/maps">Making Maps</a></li><li><a href="http://tibasicdev.wikidot.com/movement">Movement in Maps</a></li><li><a href="http://tibasicdev.wikidot.com/multiplayer">Multiplayer</a></li><li><a href="http://tibasicdev.wikidot.com/piecewise-expressions">Piecewise Expressions</a></li><li><a href="http://tibasicdev.wikidot.com/protection">Program Protection</a></li><li><a href="http://tibasicdev.wikidot.com/recursion">Recursion</a></li><li><a href="http://tibasicdev.wikidot.com/saving">Saving</a></li><li><a href="http://tibasicdev.wikidot.com/selfmodify">Self-Modifying Code (SMC)</a></li><li><a href="http://tibasicdev.wikidot.com/subprograms">Subprograms</a></li><li><a href="http://tibasicdev.wikidot.com/validation">Validation of User Input</a></li></ul></div></div></div><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Miscellaneous</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Miscellaneous</a></div><div class="collapsible-block-content"><ul><li><a href="http://tibasicdev.wikidot.com/experiment">Experiment</a></li><li><a href="http://tibasicdev.wikidot.com/programs-h">Programs</a></li><li><a href="http://tibasicdev.wikidot.com/sitemap">Sitemap</a></li></ul></div></div></div></div><div style="height: 5px;"></div><p><span style="font-size:large;">References</span></p><ul><li><a href="http://tibasicdev.wikidot.com/resources">Resources</a></li><li><a href="http://tibasicdev.wikidot.com/downloads">Downloads</a></li><li><a href="http://tibasicdev.wikidot.com/showcases">Showcases</a></li><li><a href="http://tibasicdev.wikidot.com/sidebar">Sidebar</a></li><li><a href="http://tibasicdev.wikidot.com/tokens">Token Size</a></li><li><a href="http://tibasicdev.wikidot.com/textsprites">Text Sprites</a></li><li><a href="http://tibasicdev.wikidot.com/binandhex">Binary &amp; Hex</a></li><li><a href="http://tibasicdev.wikidot.com/83lgfont">TI-83+ Font</a></li><li><a href="http://tibasicdev.wikidot.com/errors">Error Conditions</a></li><li><a href="http://tibasicdev.wikidot.com/file-extensions">File Extensions</a></li><li><a href="http://tibasicdev.wikidot.com/key-codes">Key Codes</a></li><li><a href="http://tibasicdev.wikidot.com/abbreviations">Abbreviations</a></li><li><a href="http://tibasicdev.wikidot.com/glossary">Glossary</a></li></ul><div class="collapsible-block"><div class="collapsible-block-folded"><span style="font-size:large;"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">+&nbsp;Add&nbsp;Page</a></span></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><span style="font-size:large;"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">-&nbsp;Add&nbsp;Page</a></span></div><div class="collapsible-block-content"><div style="text-align: center"> <form action="about:blank"> <select class="select" id="themePreviewerSelect" onchange="window.location.href=window.location.href.replace(/\?.*/, '').replace(/(\/theme_id\/[0-9]+)|$/, '/theme_id/'+$('themePreviewerSelect').value);">
<option  value="6651">Basic</option>
<option  value="6650">Bloo - no side bar</option>
<option  value="25">Cappuccino</option>
<option  value="26">Cappuccino - side bar on right</option>
<option  value="2">Clean</option>
<option  value="3">Clean - no side bar</option>
<option  value="56">Co</option>
<option  value="121">Co - no side bar</option>
<option  value="5">Flannel</option>
<option  value="9">Flannel Nature</option>
<option  value="10">Flannel Nature - no side bar</option>
<option  value="6">Flannel - no side bar</option>
<option  value="7">Flannel Ocean</option>
<option  value="8">Flannel Ocean - no side bar</option>
<option  value="57">Flower Blossom</option>
<option  value="75">Flower Blossom - no side bar</option>
<option  value="54">Gila</option>
<option  value="55">Gila - no side bar</option>
<option  value="58">Localize</option>
<option  value="59">Localize - no side bar</option>
<option  value="2439">Shiny</option>
<option  value="2440">Shiny - no side bar</option>
<option  value="2437">Webbish</option>
<option  value="2438">Webbish - no side bar</option>
<option  value="122">Webbish (older)</option>
<option  value="123">Webbish (older) - no side bar</option>
<option  value="6258">Bloo</option>
<option  value="12513">Blank</option>
<option  value="12806">Empty Page</option>
<option  value="4029">Forum Side</option>
<option selected="selected" value="12519">New TI|BD by JK</option>
<option  value="12783">New TI|BD by JK 2</option>
<option  value="3741">Portal</option>
<option  value="11812">Portal (Hide hidden class)</option>
<option  value="49">Pretty Print</option>
<option  value="9368">Pretty Print (Forum)</option>
</select>

</form>
</div>

<div class="new-page-box" style="text-align: center; margin: 1em 0">
<form action="dummy.html" method="get" onsubmit="WIKIDOT.modules.NewPageHelperModule.listeners.create(event)">
<input class="text" name="pageName" type="text" size="18" maxlength="60" style="margin: 1px"/><input type="submit" class="button" value="new page" style="margin: 1px"/>

</form>
</div>
</div></div></div><div style="text-align:center;"><p><script type="text/javascript">
//<![CDATA[
var sc_project=2373092;
var sc_invisible=0;
var sc_partition=22;
var sc_security="d8087415";
//]]></script><script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script><noscript><div class="statcounter"><a class="statcounter" href="http://www.statcounter.com/"><img class="statcounter" src="http://c23.statcounter.com/2373092/0/d8087415/0/" alt="counter free hit unique web" /></a></div></noscript></p></div>

</div>

<div id="main-content">
<div id="action-area-top"></div>

<div id="page-title">
The Calculators                    </div>

<div id="page-content">

<p>This section is concerned with the TI-83 family of graphing calculators, which all use the same base processor chip — a Zilog Z80. There are five different calculators that are within this group: TI-83, TI-83+, TI-83+SE, TI-84+, and TI-84+SE. Each of these calculators has their own features and unique qualities.</p>
<tr>
<div id="toc">
<div id="toc-action-bar"><a href="javascript:;" onclick="WIKIDOT.page.listeners.foldToc(event)">fold</a><a style="display: none" href="javascript:;" onclick="WIKIDOT.page.listeners.unfoldToc(event)">unfold</a></div>
<div id="toc-list">
<div style="margin-left: 1em;"><a href="#toc0">The TI-83 Calculator</a></div>
<div style="margin-left: 1em;"><a href="#toc1">The TI-83+ Calculator</a></div>
<div style="margin-left: 1em;"><a href="#toc2">The TI-83+SE Calculator</a></div>
<div style="margin-left: 1em;"><a href="#toc3">The TI-84+ Calculator</a></div>
<div style="margin-left: 1em;"><a href="#toc4">The TI-84+SE Calculator</a></div>
<div style="margin-left: 1em;"><a href="#toc5">Calculator Comparison</a></div>
<div style="margin-left: 1em;"><a href="#toc6">Known ROM Versions</a></div>
</div>
</div>
</td>
</tr>
</table>
<h1 id="toc0"><span>The TI-83 Calculator</span></h1>
<table style="width:100%;">
<tr>
<td style="vertical-align:top;"><img src="/local--files/thecalcs/ti83.png" alt="ti83.png" class="image" /></td>
<td style="vertical-align:top; padding-left:10px;">The TI-83 is the oldest calculator in the group, being released back in 1996. It is designed to be an upgrade from the TI-82, featuring a sleeker case design, more memory (27K bytes of RAM), and a faster processor (6MHz). It kept some of the features the same as the TI-82, such as the screen size and being powered by 4 AAA batteries, to allow for backwards compatibility with the TI-82.
<p>This means that while some of the TI-Basic commands on the TI-83 have a different syntax, at the core the TI-83 can execute the TI-82's TI-Basic programs. Some of the differences between TI-Basic for each calculator are how math is interpreted (implied multiplication versus regular multiplication) and commands that have an opening parentheses attached to the end of them (such as the trigonometry commands). When it comes to assembly programs, however, the TI-83 cannot execute the TI-82's assembly programs without some modification because of the processor upgrade.</p>
</td>
</tr>
</table>
<h1 id="toc1"><span>The TI-83+ Calculator</span></h1>
<table style="width:100%;">
<tr>
<td style="vertical-align:top;"><img src="/local--files/thecalcs/ti83plus.png" alt="ti83plus.png" class="image" /></td>
<td style="vertical-align:top; padding-left:10px;">The TI-83+ was released in 1999, and it was meant as an upgrade from the TI-83 with more memory and a faster processor. At the same time, it kept several features of the TI-83 to maintain backwards compatibility: the case design, the screen size (16x8 home screen and 96x64 graph screen), and the link port. There are some major differences, however.
<p>The TI-83+ cannot run assembly programs made for the TI-83 because it uses a different format: there are three built-in commands (<a href="http://tibasicdev.wikidot.com/asmprgm">AsmPrgm</a>, <a href="http://tibasicdev.wikidot.com/asmcomp">AsmComp(</a> and <a href="http://tibasicdev.wikidot.com/asm-command">Asm(</a>) used for running assembly programs, while the TI-83 has no such commands. While the TI-83 uses a 6MHz processor, the TI-83 Plus uses a speedier 8MHz processor. It should be noted, however, that the TI-83+ only runs at the 6MHz speed unless altered by an assembly program.</p>
<p>The TI-83 comes with 24K bytes of available memory built-in, while the TI-83+ comes with 184K bytes of available memory: 24K bytes are RAM and 160K bytes are archive memory, or more commonly called "Flash" memory. Archive memory allows you to store data, programs, applications, or any other variables to a safe location where they cannot be edited or deleted inadvertently from a RAM crash. This creates a compatibility issue with TI-83 TI-Basic, however, because of the use of the <a href="http://tibasicdev.wikidot.com/archive">Archive</a> and <a href="http://tibasicdev.wikidot.com/unarchive">UnArchive</a> commands that are on the TI-83+.</p>
</td>
</tr>
</table>
<h1 id="toc2"><span>The TI-83+SE Calculator</span></h1>
<table style="width:100%;">
<tr>
<td style="vertical-align:top;"><img src="/local--files/thecalcs/ti83plus_se.png" alt="ti83plus_se.png" class="image" /></td>
<td style="vertical-align:top; padding-left:10px;">The TI-83+SE (short for <em>S</em>ilver <em>E</em>dition) was the next calculator upgrade in the group. When it was released by TI in 2001, it became instantly popular because of its unique look and increased memory and speed. However, TI has since decided to stop production of it and focus on the TI-84+SE calculator instead. The TI-83+SE has now become somewhat of a collector's item.
<p>After seeing the success of the TI-83 calculator series, TI decided to give their next TI-83 series calculator a unique look to set it apart from the other TI-83 calculators. The TI-83+SE calculator look consists of a transparent silver case with silver sparkles sprinkled throughout. What really made the calculator shine, though, was that the transparent case allowed you to see what the internals of the calculator looked like without even having to open up the calculator.</p>
<p>In addition to the unique look, TI also decided to upgrade the memory and speed. While maintaining almost complete backward compatibility, the TI-83+SE features 128K bytes of RAM and 1.5M bytes of archive memory. It should be noted, however, that only 24K bytes of RAM are available to TI-Basic programmers (you need to use assembly to access all 128K bytes). The TI-83+SE uses a 15MHz processor, but it can also be made to run at the 8MHz and 6MHz speeds through assembly.</p>
</td>
</tr>
</table>
<h1 id="toc3"><span>The TI-84+ Calculator</span></h1>
<table style="width:100%;">
<tr>
<td style="vertical-align:top;"><img src="/local--files/thecalcs/ti84plus.png" alt="ti84plus.png" class="image" /></td>
<td style="vertical-align:top; padding-left:10px;">The TI-84+ was released in 2004, and it was meant to be an upgrade of the TI-83+. The TI-84+ introduces a couple new things to the TI-83 calculator series: a built-in clock and a mini USB link port. The built-in clock can be used in TI-Basic by using the new <a href="http://tibasicdev.wikidot.com/time-and-date">clock</a> commands that go with it, while the mini USB link port greatly increases the speed of linking the calculator to a computer.
<p>The TI-84+ also improves upon the TI-83+ in terms of memory and speed: 24K bytes of RAM and 480K bytes of archive memory; and a 15MHz processor (the same one that the TI-83+SE has). The most obvious change that the TI-84+ brings is a completely new case design. Gone are the slightly rounded edges and appearance; in its place is an almost circular look from the front, with the edges smoothly flowing around to the back of the calculator.</p>
</td>
</tr>
</table>
<h1 id="toc4"><span>The TI-84+SE Calculator</span></h1>
<table style="width:100%;">
<tr>
<td style="vertical-align:top;"><img src="/local--files/thecalcs/ti84plus_se.png" alt="ti84plus_se.png" class="image" /></td>
<td style="vertical-align:top; padding-left:10px;">The TI-84+SE was released along with the TI-84+ in 2004, kind of like a TI-83 calculator series package upgrade. The TI-84+SE was meant to be an upgrade of the TI-83+SE, and it includes the same upgrades that the TI-84+ got. The two new innovations that the TI-84+SE introduces are: interchangeable faceplates and a kickstand; these things are basically optional add-ons for your calculator.
<p>The interchangeable faceplate can be useful if you want to change the front look of your calculator. You simply purchase a different faceplate and swap it with the current faceplate. The calculator's initial faceplate is a light gray/silver. The kickstand is built into the calculator lid, and it allows you to set the calculator to four different viewing angles. Concerning memory and speed, the TI-84+SE has the same amount of memory and speed as the TI-83+SE.</p>
</td>
</tr>
</table>
<h1 id="toc5"><span>Calculator Comparison</span></h1>
<table class="wiki-content-table">
<tr>
<th>Model</th>
<th>Processor</th>
<th>RAM</th>
<th>ROM</th>
<th>Screen Size</th>
<th>Clock</th>
<th>Release Date</th>
</tr>
<tr>
<td style="text-align: center;">TI-83</td>
<td style="text-align: center;">6&nbsp;MHz</td>
<td style="text-align: center;">27&nbsp;KB</td>
<td style="text-align: center;">None</td>
<td style="text-align: center;">96x64</td>
<td style="text-align: center;">I/O</td>
<td style="text-align: center;">No</td>
<td style="text-align: center;">1996</td>
</tr>
<tr>
<td style="text-align: center;">TI-83+</td>
<td style="text-align: center;">6&nbsp;MHz</td>
<td style="text-align: center;">24&nbsp;KB</td>
<td style="text-align: center;">160&nbsp;KB</td>
<td style="text-align: center;">96x64</td>
<td style="text-align: center;">I/O</td>
<td style="text-align: center;">No</td>
<td style="text-align: center;">1999</td>
</tr>
<tr>
<td style="text-align: center;">TI-83+SE</td>
<td style="text-align: center;">15&nbsp;MHz</td>
<td style="text-align: center;">24KB (128&nbsp;KB)</td>
<td style="text-align: center;">1.5&nbsp;MB</td>
<td style="text-align: center;">96x64</td>
<td style="text-align: center;">I/O</td>
<td style="text-align: center;">No</td>
<td style="text-align: center;">2001</td>
</tr>
<tr>
<td style="text-align: center;">TI-84+</td>
<td style="text-align: center;">15&nbsp;MHz</td>
<td style="text-align: center;">24&nbsp;KB</td>
<td style="text-align: center;">480&nbsp;KB</td>
<td style="text-align: center;">96x64</td>
<td style="text-align: center;">I/O+USB</td>
<td style="text-align: center;">Yes</td>
<td style="text-align: center;">2004</td>
</tr>
<tr>
<td style="text-align: center;">TI-84+SE</td>
<td style="text-align: center;">15&nbsp;MHz</td>
<td style="text-align: center;">24KB (128&nbsp;KB)</td>
<td style="text-align: center;">1.5&nbsp;MB</td>
<td style="text-align: center;">96x64</td>
<td style="text-align: center;">I/O+USB</td>
<td style="text-align: center;">Yes</td>
<td style="text-align: center;">2004</td>
</tr>
</table>
<h1 id="toc6"><span>Known ROM Versions</span></h1>
<p>TI occasionally releases updates to the ROM version for each calculator, which either fix existing bugs, improve calculator performance, or add new commands and functionality. You can check the ROM version on your calculator by selecting the About option in the Memory menu, which is accessible by pressing 2nd MEM. See <a href="http://tibasicdev.wikidot.com/portability">portability</a> for a list of changes in functionality between the OS versions.</p>
<table class="wiki-content-table">
<tr>
<th>Model</th>
<th>Known ROM Versions</th>
</tr>
<tr>
<td style="text-align: center;">TI-83</td>
<td style="text-align: center;">1.02, 1.03, 1.04, 1.06, 1.07, 1.08, 1.10</td>
</tr>
<tr>
<td style="text-align: center;">TI-83+</td>
<td style="text-align: center;">1.03, 1.06, 1.08, 1.10, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19</td>
</tr>
<tr>
<td style="text-align: center;">TI-83+SE</td>
<td style="text-align: center;">1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19</td>
</tr>
<tr>
<td style="text-align: center;">TI-84+</td>
<td style="text-align: center;">2.21, 2.22, 2.30, 2.40, 2.41, 2.43</td>
</tr>
<tr>
<td style="text-align: center;">TI-84+SE</td>
<td style="text-align: center;">2.21, 2.22, 2.30, 2.40, 2.41, 2.43</td>
</tr>
</table>
<p>Except for the TI-83 which has no Flash ROM, all of the other TI-83 series of calculators come with some pre-loaded applications for users to use. Since most of the applications are rather limited in use and scope, not to mention that they each take up 16K bytes or more of memory, most people end up deleting them off of their calculator to allow them to fit more programs and games. If you want to put them back on your calculator again, you can find them all on <a href="http://education.ti.com" onclick="window.open(this.href, '_blank'); return false;">TI's website</a>.</p>
<table class="wiki-content-table">
<tr>
<th>Model</th>
</tr>
<tr>
<td style="text-align: center;">TI-83+</td>
<td style="text-align: center;">Language Localization, Probability Simulation, Science Tools, StudyCards, Vernier EasyData</td>
</tr>
<tr>
<td style="text-align: center;">TI-83+SE</td>
<td style="text-align: center;">CellSheet, GeoMaster, Language Localization, Organizer, Periodic Table, StudyCards</td>
</tr>
<tr>
<td style="text-align: center;">TI-84+</td>
<td style="text-align: center;">Cabri Jr., Conic Graphing, Inequality Graphing, Language Localization, LearningCheck, LogIn, Probability Simulation, Science Tools, StudyCards, TI CBL/CBR, TImeSpan, Topics in Algebra 1, Transformation Graphing, Vernier EasyData</td>
</tr>
<tr>
<td style="text-align: center;">TI-84+SE</td>
<td style="text-align: center;">app4math, Area Formulas, Cabri Jr., Catalog Help, CellSheet, Conic Graphing, Fundamental Topics in Science, GeoMaster, Inequality Graphing, Language Localization, LearningCheck, LogIn, NoteFolio, Organizer, Periodic Table, Polynomial Root Finder and Simultaneous Equation Solver, Probability Simulation, Puzzle Pack, Science Tools, Start-Up Customization, StudyCards, TI CBL/CBR, TImeSpan, Topics in Algebra 1, Transformation Graphing, Vernier EasyData</td>
</tr>
</table>
<div style="display : none;">
<p>.</p>
</div>

</div>

<div class="page-tags">
<span>
page tags:
<a href="http://tibasicdev.wikidot.com/system:page-tags/tag/_preparation1#pages">_preparation1</a>
</span>
</div>

<div style="clear:both; height:1px; font-size:1px;"></div>
<div id="page-info">page_revision: 55, last_edited: <span class="odate">1238804012|%e %b %Y, %H:%M %Z (%O ago)</span></div><div class="page-watch-options">            Start watching:
<a href="javascript:;"
onclick="WIKIDOT.page.listeners.awatch(event, 'site')"
>site tibasicdev.wikidot.com</a>
|
<a href="javascript:;"
onclick="WIKIDOT.page.listeners.awatch(event, 'category')"
>category _default</a>
|
<a href="javascript:;"
onclick="WIKIDOT.page.listeners.awatch(event, 'page')"

[<a href="http://www.wikidot.com/faq:watching" target="_blank">?</a>]
</div>
<div id="page-options-bottom"  class="page-options-bottom">
<a href="javascript:;" id="edit-button">edit</a><a href="javascript:;" id="tags-button">tags</a><a href="http://tibasicdev.wikidot.com/forum/t-3681/thecalcs"  id="discuss-button">discuss (#)</a>
<a href="javascript:;" id="history-button">history</a>
<a href="javascript:;" id="files-button">files</a> <a href="javascript:;" id="print-button">print</a> <a href="javascript:;" id="site-tools-button">site tools</a><a href="javascript:;" id="more-options-button">+&nbsp;options</a>
</div>
<div id="page-options-bottom-2" class="page-options-bottom" style="display:none">
<a href="javascript:;" id="edit-sections-button">edit sections</a>
<a href="javascript:;" id="edit-append-button">append</a>

<a href="javascript:;" id="view-source-button">view source</a>
<a href="javascript:;" id="parent-page-button">parent</a>
<a href="javascript:;" id="page-block-button">block</a>
<a href="javascript:;" id="rename-move-button">rename</a>
<a href="javascript:;" id="delete-button">delete</a>
</div>
<div id="page-options-area-bottom">
</div>

<div id="action-area" style="display: none"></div>
</div>
</div>

<div id="footer" style="display: block; visibility: visible;">
<div class="options" style="display: block; visibility: visible;">
<a href="http://www.wikidot.com/doc" id="wikidot-help-button">
help                         </a>
|
<a href="http://www.wikidot.com/legal:terms-of-service"   id="wikidot-tos-button">
|
<a href="http://www.wikidot.com/legal:privacy-policy"   id="wikidot-privacy-button">
privacy                         </a>
|
<a href="javascript:;" id="bug-report-button"
onclick="WIKIDOT.page.listeners.pageBugReport(event)">
report a bug                         </a>
|
<a href="javascript:;" id="abuse-report-button"
onclick="WIKIDOT.page.listeners.flagPageObjectionable(event)">
flag as objectionable                         </a>
</div>
Hosted by <a href="http://www.wikidot.com">Wikidot.com</a> &#8212;
<a href="http://www.wikidot.com/new-site">get your free wiki now!</a>
</div>
</div>

<div id="extrac-div-1"><span></span></div><div id="extrac-div-2"><span></span></div><div id="extrac-div-3"><span></span></div>

</div>
</div>

<!-- These extra divs/spans may be used as catch-alls to add extra imagery. -->
<div id="extra-div-1"><span></span></div><div id="extra-div-2"><span></span></div><div id="extra-div-3"><span></span></div>
<div id="extra-div-4"><span></span></div><div id="extra-div-5"><span></span></div><div id="extra-div-6"><span></span></div>

<div id="page-options-bottom-tips" style="display: none">
<div id="edit-button-hovertip">
</div>
<div id="page-options-bottom-2-tips"  style="display: none">
<div id="edit-sections-button-hovertip">
Click here to toggle editing of individual sections of the page (if possible).
<div id="edit-append-button-hovertip">
Append content without editing the whole page source.         </div>
<div id="history-button-hovertip">
<div id="discuss-button-hovertip">
If you want to discuss contents of this page - this is the easiest way to do it.         </div>
<div id="files-button-hovertip">
<div id="site-tools-button-hovertip">
A few useful tools to manage this Site.         </div>
<div id="rename-move-button-hovertip">
Change the name (also URL address, possibly the category) of the page.         </div>
<div id="view-source-button-hovertip">
<div id="parent-page-button-hovertip">
View/set parent page (used for creating breadcrumbs and structured layout).         </div>
<div id="abuse-report-button-hovertip">
<div id="bug-report-button-hovertip">
Something does not work as expected? Find out what you can do.             </div>
<div id="wikidot-help-button-hovertip">
General Wikidot.com documentation and help section.             </div>
<div id="wikidot-tos-button-hovertip">
<div id="wikidot-privacy-button-hovertip">
</div>
</div>

<script type="text/javascript">
_uacct = "UA-5568715-1";
urchinTracker();
</script>

<script type="text/javascript">
_uff = false;
_uacct = "UA-68540-5";
_udn="wikidot.com";
urchinTracker();
</script>

<!-- Start Quantcast tag -->
<script type="text/javascript">
_qoptions={
qacct:"p-edL3gsnUjJzw-"
};
</script>
<script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script>
<noscript>
<img src="http://pixel.quantserve.com/pixel/p-edL3gsnUjJzw-.gif" style="display: none;" border="0" height="1" width="1" alt="Quantcast"/>
</noscript>
<!-- End Quantcast tag -->

</body>

</html>


Member

Scroll DOWN to locate CSS:

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<title>TI-Basic Developer: The Calculators</title>

<script type="text/javascript" src="http://static.wikidot.com/v--33/common--javascript/init.combined.js"></script>
<script  type="text/javascript">
// global request information

var WIKIREQUEST = {};
WIKIREQUEST.info = {};

WIKIREQUEST.info.domain = "tibasicdev.wikidot.com";
WIKIREQUEST.info.siteId = 405;
WIKIREQUEST.info.categoryId = 2265;
WIKIREQUEST.info.themeId = 49;
WIKIREQUEST.info.requestPageName = "thecalcs";
OZONE.request.timestamp = 1241040762;
OZONE.request.date = new Date();
WIKIREQUEST.info.lang = 'en';
WIKIREQUEST.info.pageUnixName = "thecalcs";
WIKIREQUEST.info.pageId = 14764;
WIKIREQUEST.info.lang = "en";
OZONE.lang = "en";
</script>

<meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
<meta http-equiv="content-language" content="en"/>
<script type="text/javascript" src="http://static.wikidot.com/v--33/common--javascript/WIKIDOT.combined.js"></script>

<style type="text/css" id="internal-style">

@import url(http://static.wikidot.com/v--33/common--theme/base/css/style.css?0);
@import url(http://static.wikidot.com/v--42/common--theme/co/css/style.css?0);

/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */
/* START CSS BELOW  */

.code {
font-size: 105%;
}

text-decoration:none;
}

display: none;
z-index: 9;
}

.default .show {
display: block;
z-index: 8;
}

display: block;
}

.infobox{
color: #FFFFFF;
}

.infobox a{
color: #FFFFFF;
}

}

background-color: #202817;
min-width: 800px;
width:expression(document.body.clientWidth < 800? "800px" : "auto");
}
margin: 0;
width: 800px; //735px; //789px;
height: 69px;
background: #202817;
background-image: url(http://tibasicdev.wikidot.com/local--files/logo/Logo10B.PNG);
}
margin: 0 320px 0 8px;
width: 472px; //721px; //735px; //789px;
height: 69px;
display: block;
}
visibility: hidden;
}
#top-bar {
top: 69px;
height: 21px;
min-width: 976px;
background-color: #5C634D;
border-bottom: 2px solid #5C634D;
}
#top-bar  a, #top-bar li ul li a {
background-color:#5C634D;
}
#top-bar a:hover, #top-bar li ul li a:hover {
background-color:#5C634D;
}
#side-bar {
min-width: 185px;
background-color:#B8C9A2;
}
#side-bar li a{
border-bottom:1px solid #ABBDA2;
border-top:1px solid #C6D4A2;
}
#side-bar li a:hover{
background-color:#C3D3B2;
}
body{
background-color:#DCE9D7;
}
#footer{
background-color:#5C634D;
border-top:2px solid #343D2A;
}
font-weight: bold;
}
.special-collapsible a {
margin: 0;
display: block;
border-bottom: 1px solid #ABBDA2;
border-top: 1px solid #C6D4A2;
color: #1E2B31;
text-decoration: none;
}
display: none;
}

color: #E7E9DC;
background: #5C634D;
}
color: #E7E9DC;
background: #5C634D;
}

table.charmap {
background: white;
border: #999 solid 1px;
border-spacing: 2px;
table-collapse: collapse;
}
table.charmap tr td {
text-align: center;
}

.wd-editor-toolbar-panel li.hseparator {
background: url('http://tibasicdev.wikidot.com/local--files/home/toolbar-separator.png');
width: 22px;
height: 22px;
margin: 1px;
}

@media print {

display: none !important;
}

div#page-content:after {
text-align: center;
width: auto !important;
display: block !important;
margin: 2em 0 0;
clear: both !important;
border-top: 1px solid #000;
content: "TI-Basic Developer © 2006-2009 — \"A wiki for the TI-Basic beginner and advanced alike!\"";
}
}

/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */
/* END CSS ABOVE  */

</style>

<body id="html-body">

<div id="container-wrap">
<div id="container">
<h1><a href="http://tibasicdev.wikidot.com/"><span>TI-Basic Developer</span></a></h1>
<h2><span>The TI-Basic Information Repository</span></h2>

<div id="search-top-box">
<form id="search-top-box-form" action="dummy">
<input id="search-top-box-input" class="text empty" type="text" size="15" name="query" value="search this site" onfocus="if(YAHOO.util.Dom.hasClass(this, 'empty')){YAHOO.util.Dom.removeClass(this,'empty'); this.value='';}"/><input class="button" type="submit" name="search" value="search"/>
</form>
</div>

<div id="top-bar">

<ul><li>Membership
<ul><li><a href="http://tibasicdev.wikidot.com/first-visit">First Time Visitor?</a></li><li><a href="http://tibasicdev.wikidot.com/conduct">Code of Conduct</a></li><li><a href="http://tibasicdev.wikidot.com/system:members">Site Members</a></li><li><a href="http://tibasicdev.wikidot.com/system:join">Become a Member</a></li><li><a href="http://tibasicdev.wikidot.com/system:invite">Invite a Friend</a></li></ul></li><li>Editing Pages
<ul><li><a href="http://tibasicdev.wikidot.com/guide-to-editing">Guide to Editing</a></li><li><a href="http://tibasicdev.wikidot.com/conventions">Wiki Conventions</a></li><li><a href="http://www.wikidot.com/doc:wiki-syntax">Wiki Syntax</a></li><li><a href="http://tibasicdev.wikidot.com/to-do">To-Do List</a></li><li><a class="wiki-standalone-button" href="javascript:;" onclick="WIKIDOT.page.listeners.viewSourceClick(event)">View Page Source</a></li><li><a href="http://tibasicdev.wikidot.com/system:recent-changes">Recent Changes</a></li><li><a href="http://tibasicdev.wikidot.com/admin:manage">Site Manager</a></li></ul></li><li>Site Information
<ul><li><a href="http://tibasicdev.wikidot.com/about">Site History</a></li><li><a href="http://tibasicdev.wikidot.com/logo">Site Logo</a></li><li><a href="http://tibasicdev.wikidot.com/all-news">News Archive</a></li><li><a href="http://tibasicdev.wikidot.com/news">83 News</a></li><li><a href="http://tibasicdev.wikidot.com/68k:news">68k News</a></li><li><a href="http://tibasicdev.wikidot.com/announcements">Announcements</a></li></ul></li><li>Related Sites
<ul><li><a href="http://www.ticalc.org" onclick="window.open(this.href, '_blank'); return false;">ticalc.org</a></li><li><a href="http://www.unitedti.org" onclick="window.open(this.href, '_blank'); return false;">United-TI</a></li><li><a href="http://www.tifreakware.net/" onclick="window.open(this.href, '_blank'); return false;">TI-Freakware</a></li><li><a href="http://www.maxcoderz.org" onclick="window.open(this.href, '_blank'); return false;">MaxCoderz</a></li><li><a href="http://www.bgo.netfirms.com" onclick="window.open(this.href, '_blank'); return false;">BASIC Guru</a></li><li><a href="http://www.education.ti.com" onclick="window.open(this.href, '_blank'); return false;">Texas Instruments</a></li><li><a href="http://www.omnimaga.org" onclick="window.open(this.href, '_blank'); return false;">Omnimaga</a></li></ul></li></ul>

</div>
<div id="login-status"><span class="printuser"><a href="http://www.wikidot.com/user:info/james-kanjo" onclick="WIKIDOT.page.listeners.userInfo(35113); return false;" ><!--[if gte IE 7]><!--><img class="small" src="/common--images/avatars/35/35113/a16.png" alt="avatar"  style="background-image:url(http://www.wikidot.com/userkarma.php?u=35113)"/><!--<![endif]--><!--[if lt IE 7]><img class="small" src="/common&#45;&#45;images/avatars/35/35113/a16.png" alt="avatar"  style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=35113,sizingMethod='scale')"/><![endif]--></a>James Kanjo</span> | <a href="http://www.wikidot.com/account:you">my account</a><a  id="account-topbutton" href="javascript:;">&nabla;</a><div id="account-options"><ul><li><a href="http://www.wikidot.com/account:you">account summary</a></li><li><a href="http://www.wikidot.com/account:you/start/messages">private messages</a></li><li><a href="http://www.wikidot.com/account:you/start/contacts">my contacts</a></li><li><a href="http://www.wikidot.com/account:you/start/notifications">notifications</a></li><li><a href="http://www.wikidot.com/account:you/start/watching">watching</a></li><li><a href="javascript:;" onclick="WIKIDOT.page.listeners.logoutClick(event)">logout</a></li></ul></div></div>
</div>

<div id="content-wrap">
<div id="side-bar">

<div class="top"><ul><li><strong><a href="http://tibasicdev.wikidot.com/home">TI-83 Basic Home</a></strong></li><li><a href="http://tibasicdev.wikidot.com/68k:home">68k TI-Basic Home</a></li><li><a href="http://tibasicdev.wikidot.com/nspire">TI-Nspire Basic Page</a></li><li><a href="http://tibasicdev.wikidot.com/archives">Program Archives</a></li><li><a href="http://tibasicdev.wikidot.com/forum:home">Discussion Forums</a></li></ul></div><p><span style="font-size:large;">Preparation</span></p><ul><li><a href="http://tibasicdev.wikidot.com/thecalcs">The Calculators</a></li><li><a href="http://tibasicdev.wikidot.com/whytibasic">Why TI-Basic?</a></li><li><a href="http://tibasicdev.wikidot.com/using-this-guide">Using This Guide</a></li><li><a href="http://tibasicdev.wikidot.com/starter-kit">TI-Basic Starter Kit</a></li><li><a href="http://tibasicdev.wikidot.com/faq">TI-Basic FAQ</a></li></ul><p><span style="font-size:large;">Main Content</span></p><div class="special-collapsible"><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Commands</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Commands</a></div><div class="collapsible-block-content"><div class="list-pages-box">

<ul>
<li><a href="http://tibasicdev.wikidot.com/commands">Overview</a></li>
<li><a href="http://tibasicdev.wikidot.com/command-index">Command Index</a></li>
<li><a href="http://tibasicdev.wikidot.com/geometpdf">Random command!</a></li>
</ul>

</div>
<select class="select" id="themePreviewerSelect"
onchange="window.location.href=window.location.href.replace(/\?.*$/, '').replace(/(\/theme_id\/[0-9]+)|$/, '/theme_id/'+('themePreviewerSelect').value);"> <option value="6651">Basic</option> <option value="6650">Bloo - no side bar</option> <option value="25">Cappuccino</option> <option value="26">Cappuccino - side bar on right</option> <option value="2">Clean</option> <option value="3">Clean - no side bar</option> <option value="56">Co</option> <option value="121">Co - no side bar</option> <option value="5">Flannel</option> <option value="9">Flannel Nature</option> <option value="10">Flannel Nature - no side bar</option> <option value="6">Flannel - no side bar</option> <option value="7">Flannel Ocean</option> <option value="8">Flannel Ocean - no side bar</option> <option value="57">Flower Blossom</option> <option value="75">Flower Blossom - no side bar</option> <option value="54">Gila</option> <option value="55">Gila - no side bar</option> <option value="58">Localize</option> <option value="59">Localize - no side bar</option> <option value="2439">Shiny</option> <option value="2440">Shiny - no side bar</option> <option value="2437">Webbish</option> <option value="2438">Webbish - no side bar</option> <option value="122">Webbish (older)</option> <option value="123">Webbish (older) - no side bar</option> <option value="6258">Bloo</option> <option value="12513">Blank</option> <option value="12806">Empty Page</option> <option value="4029">Forum Side</option> <option selected="selected" value="12519">New TI|BD by JK</option> <option value="12783">New TI|BD by JK 2</option> <option value="3741">Portal</option> <option value="11812">Portal (Hide hidden class)</option> <option value="49">Pretty Print</option> <option value="9368">Pretty Print (Forum)</option> </select> </form> </div> <div class="new-page-box" style="text-align: center; margin: 1em 0"> <form action="dummy.html" method="get" onsubmit="WIKIDOT.modules.NewPageHelperModule.listeners.create(event)"> <input class="text" name="pageName" type="text" size="18" maxlength="60" style="margin: 1px"/><input type="submit" class="button" value="new page" style="margin: 1px"/> </form> </div> </div></div></div><div style="text-align:center;"><p><script type="text/javascript"> //<![CDATA[ var sc_project=2373092; var sc_invisible=0; var sc_partition=22; var sc_security="d8087415"; //]]></script><script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script><noscript><div class="statcounter"><a class="statcounter" href="http://www.statcounter.com/"><img class="statcounter" src="http://c23.statcounter.com/2373092/0/d8087415/0/" alt="counter free hit unique web" /></a></div></noscript></p></div> </div> <!-- google_ad_section_end --> <div id="main-content"> <div id="action-area-top"></div> <!-- google_ad_section_start --> <div id="page-title"> The Calculators </div> <div id="page-content"> <p>This section is concerned with the TI-83 family of graphing calculators, which all use the same base processor chip — a Zilog Z80. There are five different calculators that are within this group: TI-83, TI-83+, TI-83+SE, TI-84+, and TI-84+SE. Each of these calculators has their own features and unique qualities.</p> <table style="margin:0; padding:0"> <tr> <td style="margin:0; padding:0"> <div id="toc"> <div id="toc-action-bar"><a href="javascript:;" onclick="WIKIDOT.page.listeners.foldToc(event)">fold</a><a style="display: none" href="javascript:;" onclick="WIKIDOT.page.listeners.unfoldToc(event)">unfold</a></div> <div class="title">Table of Contents</div> <div id="toc-list"> <div style="margin-left: 1em;"><a href="#toc0">The TI-83 Calculator</a></div> <div style="margin-left: 1em;"><a href="#toc1">The TI-83+ Calculator</a></div> <div style="margin-left: 1em;"><a href="#toc2">The TI-83+SE Calculator</a></div> <div style="margin-left: 1em;"><a href="#toc3">The TI-84+ Calculator</a></div> <div style="margin-left: 1em;"><a href="#toc4">The TI-84+SE Calculator</a></div> <div style="margin-left: 1em;"><a href="#toc5">Calculator Comparison</a></div> <div style="margin-left: 1em;"><a href="#toc6">Known ROM Versions</a></div> <div style="margin-left: 1em;"><a href="#toc7">Pre-Loaded Applications</a></div> </div> </div> </td> </tr> </table> <h1 id="toc0"><span>The TI-83 Calculator</span></h1> <table style="width:100%;"> <tr> <td style="vertical-align:top;"><img src="/local--files/thecalcs/ti83.png" alt="ti83.png" class="image" /></td> <td style="vertical-align:top; padding-left:10px;">The TI-83 is the oldest calculator in the group, being released back in 1996. It is designed to be an upgrade from the TI-82, featuring a sleeker case design, more memory (27K bytes of RAM), and a faster processor (6MHz). It kept some of the features the same as the TI-82, such as the screen size and being powered by 4 AAA batteries, to allow for backwards compatibility with the TI-82. <p>This means that while some of the TI-Basic commands on the TI-83 have a different syntax, at the core the TI-83 can execute the TI-82's TI-Basic programs. Some of the differences between TI-Basic for each calculator are how math is interpreted (implied multiplication versus regular multiplication) and commands that have an opening parentheses attached to the end of them (such as the trigonometry commands). When it comes to assembly programs, however, the TI-83 cannot execute the TI-82's assembly programs without some modification because of the processor upgrade.</p> </td> </tr> </table> <h1 id="toc1"><span>The TI-83+ Calculator</span></h1> <table style="width:100%;"> <tr> <td style="vertical-align:top;"><img src="/local--files/thecalcs/ti83plus.png" alt="ti83plus.png" class="image" /></td> <td style="vertical-align:top; padding-left:10px;">The TI-83+ was released in 1999, and it was meant as an upgrade from the TI-83 with more memory and a faster processor. At the same time, it kept several features of the TI-83 to maintain backwards compatibility: the case design, the screen size (16x8 home screen and 96x64 graph screen), and the link port. There are some major differences, however. <p>The TI-83+ cannot run assembly programs made for the TI-83 because it uses a different format: there are three built-in commands (<a href="http://tibasicdev.wikidot.com/asmprgm">AsmPrgm</a>, <a href="http://tibasicdev.wikidot.com/asmcomp">AsmComp(</a> and <a href="http://tibasicdev.wikidot.com/asm-command">Asm(</a>) used for running assembly programs, while the TI-83 has no such commands. While the TI-83 uses a 6MHz processor, the TI-83 Plus uses a speedier 8MHz processor. It should be noted, however, that the TI-83+ only runs at the 6MHz speed unless altered by an assembly program.</p> <p>The TI-83 comes with 24K bytes of available memory built-in, while the TI-83+ comes with 184K bytes of available memory: 24K bytes are RAM and 160K bytes are archive memory, or more commonly called "Flash" memory. Archive memory allows you to store data, programs, applications, or any other variables to a safe location where they cannot be edited or deleted inadvertently from a RAM crash. This creates a compatibility issue with TI-83 TI-Basic, however, because of the use of the <a href="http://tibasicdev.wikidot.com/archive">Archive</a> and <a href="http://tibasicdev.wikidot.com/unarchive">UnArchive</a> commands that are on the TI-83+.</p> </td> </tr> </table> <h1 id="toc2"><span>The TI-83+SE Calculator</span></h1> <table style="width:100%;"> <tr> <td style="vertical-align:top;"><img src="/local--files/thecalcs/ti83plus_se.png" alt="ti83plus_se.png" class="image" /></td> <td style="vertical-align:top; padding-left:10px;">The TI-83+SE (short for <em>S</em>ilver <em>E</em>dition) was the next calculator upgrade in the group. When it was released by TI in 2001, it became instantly popular because of its unique look and increased memory and speed. However, TI has since decided to stop production of it and focus on the TI-84+SE calculator instead. The TI-83+SE has now become somewhat of a collector's item. <p>After seeing the success of the TI-83 calculator series, TI decided to give their next TI-83 series calculator a unique look to set it apart from the other TI-83 calculators. The TI-83+SE calculator look consists of a transparent silver case with silver sparkles sprinkled throughout. What really made the calculator shine, though, was that the transparent case allowed you to see what the internals of the calculator looked like without even having to open up the calculator.</p> <p>In addition to the unique look, TI also decided to upgrade the memory and speed. While maintaining almost complete backward compatibility, the TI-83+SE features 128K bytes of RAM and 1.5M bytes of archive memory. It should be noted, however, that only 24K bytes of RAM are available to TI-Basic programmers (you need to use assembly to access all 128K bytes). The TI-83+SE uses a 15MHz processor, but it can also be made to run at the 8MHz and 6MHz speeds through assembly.</p> </td> </tr> </table> <h1 id="toc3"><span>The TI-84+ Calculator</span></h1> <table style="width:100%;"> <tr> <td style="vertical-align:top;"><img src="/local--files/thecalcs/ti84plus.png" alt="ti84plus.png" class="image" /></td> <td style="vertical-align:top; padding-left:10px;">The TI-84+ was released in 2004, and it was meant to be an upgrade of the TI-83+. The TI-84+ introduces a couple new things to the TI-83 calculator series: a built-in clock and a mini USB link port. The built-in clock can be used in TI-Basic by using the new <a href="http://tibasicdev.wikidot.com/time-and-date">clock</a> commands that go with it, while the mini USB link port greatly increases the speed of linking the calculator to a computer. <p>The TI-84+ also improves upon the TI-83+ in terms of memory and speed: 24K bytes of RAM and 480K bytes of archive memory; and a 15MHz processor (the same one that the TI-83+SE has). The most obvious change that the TI-84+ brings is a completely new case design. Gone are the slightly rounded edges and appearance; in its place is an almost circular look from the front, with the edges smoothly flowing around to the back of the calculator.</p> </td> </tr> </table> <h1 id="toc4"><span>The TI-84+SE Calculator</span></h1> <table style="width:100%;"> <tr> <td style="vertical-align:top;"><img src="/local--files/thecalcs/ti84plus_se.png" alt="ti84plus_se.png" class="image" /></td> <td style="vertical-align:top; padding-left:10px;">The TI-84+SE was released along with the TI-84+ in 2004, kind of like a TI-83 calculator series package upgrade. The TI-84+SE was meant to be an upgrade of the TI-83+SE, and it includes the same upgrades that the TI-84+ got. The two new innovations that the TI-84+SE introduces are: interchangeable faceplates and a kickstand; these things are basically optional add-ons for your calculator. <p>The interchangeable faceplate can be useful if you want to change the front look of your calculator. You simply purchase a different faceplate and swap it with the current faceplate. The calculator's initial faceplate is a light gray/silver. The kickstand is built into the calculator lid, and it allows you to set the calculator to four different viewing angles. Concerning memory and speed, the TI-84+SE has the same amount of memory and speed as the TI-83+SE.</p> </td> </tr> </table> <h1 id="toc5"><span>Calculator Comparison</span></h1> <table class="wiki-content-table"> <tr> <th>Model</th> <th>Processor</th> <th>RAM</th> <th>ROM</th> <th>Screen Size</th> <th>Link Port</th> <th>Clock</th> <th>Release Date</th> </tr> <tr> <td style="text-align: center;">TI-83</td> <td style="text-align: center;">6&nbsp;MHz</td> <td style="text-align: center;">27&nbsp;KB</td> <td style="text-align: center;">None</td> <td style="text-align: center;">96x64</td> <td style="text-align: center;">I/O</td> <td style="text-align: center;">No</td> <td style="text-align: center;">1996</td> </tr> <tr> <td style="text-align: center;">TI-83+</td> <td style="text-align: center;">6&nbsp;MHz</td> <td style="text-align: center;">24&nbsp;KB</td> <td style="text-align: center;">160&nbsp;KB</td> <td style="text-align: center;">96x64</td> <td style="text-align: center;">I/O</td> <td style="text-align: center;">No</td> <td style="text-align: center;">1999</td> </tr> <tr> <td style="text-align: center;">TI-83+SE</td> <td style="text-align: center;">15&nbsp;MHz</td> <td style="text-align: center;">24KB (128&nbsp;KB)</td> <td style="text-align: center;">1.5&nbsp;MB</td> <td style="text-align: center;">96x64</td> <td style="text-align: center;">I/O</td> <td style="text-align: center;">No</td> <td style="text-align: center;">2001</td> </tr> <tr> <td style="text-align: center;">TI-84+</td> <td style="text-align: center;">15&nbsp;MHz</td> <td style="text-align: center;">24&nbsp;KB</td> <td style="text-align: center;">480&nbsp;KB</td> <td style="text-align: center;">96x64</td> <td style="text-align: center;">I/O+USB</td> <td style="text-align: center;">Yes</td> <td style="text-align: center;">2004</td> </tr> <tr> <td style="text-align: center;">TI-84+SE</td> <td style="text-align: center;">15&nbsp;MHz</td> <td style="text-align: center;">24KB (128&nbsp;KB)</td> <td style="text-align: center;">1.5&nbsp;MB</td> <td style="text-align: center;">96x64</td> <td style="text-align: center;">I/O+USB</td> <td style="text-align: center;">Yes</td> <td style="text-align: center;">2004</td> </tr> </table> <h1 id="toc6"><span>Known ROM Versions</span></h1> <p>TI occasionally releases updates to the ROM version for each calculator, which either fix existing bugs, improve calculator performance, or add new commands and functionality. You can check the ROM version on your calculator by selecting the About option in the Memory menu, which is accessible by pressing 2nd MEM. See <a href="http://tibasicdev.wikidot.com/portability">portability</a> for a list of changes in functionality between the OS versions.</p> <table class="wiki-content-table"> <tr> <th>Model</th> <th>Known ROM Versions</th> </tr> <tr> <td style="text-align: center;">TI-83</td> <td style="text-align: center;">1.02, 1.03, 1.04, 1.06, 1.07, 1.08, 1.10</td> </tr> <tr> <td style="text-align: center;">TI-83+</td> <td style="text-align: center;">1.03, 1.06, 1.08, 1.10, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19</td> </tr> <tr> <td style="text-align: center;">TI-83+SE</td> <td style="text-align: center;">1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19</td> </tr> <tr> <td style="text-align: center;">TI-84+</td> <td style="text-align: center;">2.21, 2.22, 2.30, 2.40, 2.41, 2.43</td> </tr> <tr> <td style="text-align: center;">TI-84+SE</td> <td style="text-align: center;">2.21, 2.22, 2.30, 2.40, 2.41, 2.43</td> </tr> </table> <h1 id="toc7"><span>Pre-Loaded Applications</span></h1> <p>Except for the TI-83 which has no Flash ROM, all of the other TI-83 series of calculators come with some pre-loaded applications for users to use. Since most of the applications are rather limited in use and scope, not to mention that they each take up 16K bytes or more of memory, most people end up deleting them off of their calculator to allow them to fit more programs and games. If you want to put them back on your calculator again, you can find them all on <a href="http://education.ti.com" onclick="window.open(this.href, '_blank'); return false;">TI's website</a>.</p> <table class="wiki-content-table"> <tr> <th>Model</th> <th>Pre-Loaded Applications</th> </tr> <tr> <td style="text-align: center;">TI-83+</td> <td style="text-align: center;">Language Localization, Probability Simulation, Science Tools, StudyCards, Vernier EasyData</td> </tr> <tr> <td style="text-align: center;">TI-83+SE</td> <td style="text-align: center;">CellSheet, GeoMaster, Language Localization, Organizer, Periodic Table, StudyCards</td> </tr> <tr> <td style="text-align: center;">TI-84+</td> <td style="text-align: center;">Cabri Jr., Conic Graphing, Inequality Graphing, Language Localization, LearningCheck, LogIn, Probability Simulation, Science Tools, StudyCards, TI CBL/CBR, TImeSpan, Topics in Algebra 1, Transformation Graphing, Vernier EasyData</td> </tr> <tr> <td style="text-align: center;">TI-84+SE</td> <td style="text-align: center;">app4math, Area Formulas, Cabri Jr., Catalog Help, CellSheet, Conic Graphing, Fundamental Topics in Science, GeoMaster, Inequality Graphing, Language Localization, LearningCheck, LogIn, NoteFolio, Organizer, Periodic Table, Polynomial Root Finder and Simultaneous Equation Solver, Probability Simulation, Puzzle Pack, Science Tools, Start-Up Customization, StudyCards, TI CBL/CBR, TImeSpan, Topics in Algebra 1, Transformation Graphing, Vernier EasyData</td> </tr> </table> <div style="display : none;"> <p>.</p> </div> </div> <div class="page-tags"> <span> page tags: <a href="http://tibasicdev.wikidot.com/system:page-tags/tag/_preparation1#pages">_preparation1</a> </span> </div> <!-- google_ad_section_end --> <!-- google_ad_section_start(weight=ignore) --> <div style="clear:both; height:1px; font-size:1px;"></div> <div id="page-info">page_revision: 55, last_edited: <span class="odate">1238804012|%e %b %Y, %H:%M %Z (%O ago)</span></div><div class="page-watch-options"> Start watching: <a href="javascript:;" onclick="WIKIDOT.page.listeners.awatch(event, 'site')" >site tibasicdev.wikidot.com</a> | <a href="javascript:;" onclick="WIKIDOT.page.listeners.awatch(event, 'category')" >category _default</a> | <a href="javascript:;" onclick="WIKIDOT.page.listeners.awatch(event, 'page')" >this page</a> [<a href="http://www.wikidot.com/faq:watching" target="_blank">?</a>] </div> <div id="page-options-bottom" class="page-options-bottom"> <a href="javascript:;" id="edit-button">edit</a><a href="javascript:;" id="tags-button">tags</a><a href="http://tibasicdev.wikidot.com/forum/t-3681/thecalcs" id="discuss-button">discuss (#)</a> <a href="javascript:;" id="history-button">history</a> <a href="javascript:;" id="files-button">files</a> <a href="javascript:;" id="print-button">print</a> <a href="javascript:;" id="site-tools-button">site tools</a><a href="javascript:;" id="more-options-button">+&nbsp;options</a> </div> <div id="page-options-bottom-2" class="page-options-bottom" style="display:none"> <a href="javascript:;" id="edit-sections-button">edit sections</a> <a href="javascript:;" id="edit-append-button">append</a> <a href="javascript:;" id="backlinks-button">backlinks</a> <a href="javascript:;" id="view-source-button">view source</a> <a href="javascript:;" id="parent-page-button">parent</a> <a href="javascript:;" id="page-block-button">block</a> <a href="javascript:;" id="rename-move-button">rename</a> <a href="javascript:;" id="delete-button">delete</a> </div> <div id="page-options-area-bottom"> </div> <div id="action-area" style="display: none"></div> </div> </div> <div id="footer" style="display: block; visibility: visible;"> <div class="options" style="display: block; visibility: visible;"> <a href="http://www.wikidot.com/doc" id="wikidot-help-button"> help </a> | <a href="http://www.wikidot.com/legal:terms-of-service" id="wikidot-tos-button"> terms of service </a> | <a href="http://www.wikidot.com/legal:privacy-policy" id="wikidot-privacy-button"> privacy </a> | <a href="javascript:;" id="bug-report-button" onclick="WIKIDOT.page.listeners.pageBugReport(event)"> report a bug </a> | <a href="javascript:;" id="abuse-report-button" onclick="WIKIDOT.page.listeners.flagPageObjectionable(event)"> flag as objectionable </a> </div> Hosted by <a href="http://www.wikidot.com">Wikidot.com</a> &#8212; <a href="http://www.wikidot.com/new-site">get your free wiki now!</a> </div> <div id="license-area" class="license-area"> Unless stated otherwise Content of this page is licensed under <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License</a> </div> <div id="extrac-div-1"><span></span></div><div id="extrac-div-2"><span></span></div><div id="extrac-div-3"><span></span></div> </div> </div> <!-- These extra divs/spans may be used as catch-alls to add extra imagery. --> <div id="extra-div-1"><span></span></div><div id="extra-div-2"><span></span></div><div id="extra-div-3"><span></span></div> <div id="extra-div-4"><span></span></div><div id="extra-div-5"><span></span></div><div id="extra-div-6"><span></span></div> <div id="page-options-bottom-tips" style="display: none"> <div id="edit-button-hovertip"> Click here to edit contents of this page. </div> </div> <div id="page-options-bottom-2-tips" style="display: none"> <div id="edit-sections-button-hovertip"> Click here to toggle editing of individual sections of the page (if possible). Watch headings for an "edit" link when available. </div> <div id="edit-append-button-hovertip"> Append content without editing the whole page source. </div> <div id="history-button-hovertip"> Check out how this page has evolved in the past. </div> <div id="discuss-button-hovertip"> If you want to discuss contents of this page - this is the easiest way to do it. </div> <div id="files-button-hovertip"> View and manage file attachments for this page. </div> <div id="site-tools-button-hovertip"> A few useful tools to manage this Site. </div> <div id="backlinks-button-hovertip"> See pages that link to and include this page. </div> <div id="rename-move-button-hovertip"> Change the name (also URL address, possibly the category) of the page. </div> <div id="view-source-button-hovertip"> View wiki source for this page without editing. </div> <div id="parent-page-button-hovertip"> View/set parent page (used for creating breadcrumbs and structured layout). </div> <div id="abuse-report-button-hovertip"> Notify administrators if there is objectionable content in this page. </div> <div id="bug-report-button-hovertip"> Something does not work as expected? Find out what you can do. </div> <div id="wikidot-help-button-hovertip"> General Wikidot.com documentation and help section. </div> <div id="wikidot-tos-button-hovertip"> Wikidot.com Terms of Service - what you can, what you should not etc. </div> <div id="wikidot-privacy-button-hovertip"> Wikidot.com Privacy Policy. </div> </div> <!-- google_ad_section_end --> <div id="account-notifications-dummy" style="display:none"></div> <div style="display:none" id="dummy-ondomready-block"></div> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript"> _uacct = "UA-5568715-1"; urchinTracker(); </script> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript"> _uff = false; _uacct = "UA-68540-5"; _udn="wikidot.com"; urchinTracker(); </script> <!-- Start Quantcast tag --> <script type="text/javascript"> _qoptions={ qacct:"p-edL3gsnUjJzw-" }; </script> <script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script> <noscript> <img src="http://pixel.quantserve.com/pixel/p-edL3gsnUjJzw-.gif" style="display: none;" border="0" height="1" width="1" alt="Quantcast"/> </noscript> <!-- End Quantcast tag --> </body> </html>  Scroll DOWN to locate CSS: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>TI-Basic Developer: The Calculators</title> <script type="text/javascript" src="http://static.wikidot.com/v--33/common--javascript/init.combined.js"></script> <script type="text/javascript"> // global request information var WIKIREQUEST = {}; WIKIREQUEST.info = {}; WIKIREQUEST.info.domain = "tibasicdev.wikidot.com"; WIKIREQUEST.info.siteId = 405; WIKIREQUEST.info.categoryId = 2265; WIKIREQUEST.info.themeId = 49; WIKIREQUEST.info.requestPageName = "thecalcs"; OZONE.request.timestamp = 1241040762; OZONE.request.date = new Date(); WIKIREQUEST.info.lang = 'en'; WIKIREQUEST.info.pageUnixName = "thecalcs"; WIKIREQUEST.info.pageId = 14764; WIKIREQUEST.info.lang = "en"; OZONE.lang = "en"; // window.onload = WikidotInit(); </script> <meta http-equiv="content-type" content="text/html;charset=UTF-8"/> <meta http-equiv="content-language" content="en"/> <script type="text/javascript" src="http://static.wikidot.com/v--33/common--javascript/WIKIDOT.combined.js"></script> <style type="text/css" id="internal-style"> @import url(http://static.wikidot.com/v--33/common--modules/css/monetize/textlinkads/MonetizeTextLinkAdsModule.css); @import url(http://static.wikidot.com/v--33/common--theme/base/css/style.css?0); @import url(http://static.wikidot.com/v--42/common--theme/co/css/style.css?0); /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ /* START CSS BELOW */ .code { font-size: 105%; } .hidden-collapsible .collapsible-block-link { text-decoration:none; } .menu .show { display: none; z-index: 9; } .default .show { display: block; z-index: 8; } .menu:hover .show { display: block; } .infobox{ color: #FFFFFF; } .infobox a{ color: #FFFFFF; } .blink, .blink a { text-decoration: blink; } #header { background-color: #281720; min-width: 800px; width:expression(document.body.clientWidth < 800? "800px" : "auto"); } #header h1 { padding: 0; margin: 0; width: 800px; //735px; //789px; height: 69px; background: #281720; background-image: url(http://tibasicdev.wikidot.com/local--files/logo/Logo10B.PNG); } #header h1 a { padding: 0; margin: 0 320px 0 8px; width: 472px; //721px; //735px; //789px; height: 69px; display: block; } #header h1 span { visibility: hidden; } #top-bar { top: 69px; height: 21px; min-width: 976px; padding: 0; background-color: #634D5C; border-bottom: 2px solid #634D5C; } #top-bar a, #top-bar li ul li a { background-color:#634D5C; } #top-bar a:hover, #top-bar li ul li a:hover { background-color:#634D5C; } #side-bar { min-width: 185px; background-color:#B8C7C9; } #side-bar li a{ border-bottom:1px solid #ABBBBE; border-top:1px solid #C6D2D3; } #side-bar li a:hover{ background-color:#C3D1D3; } body{ background-color:#DCE7E9; } #footer{ background-color:#634D5C; border-top:2px solid #3D2A34; } .special-collapsible .collapsible-block-unfolded .collapsible-block-link { font-weight: bold; padding-left: 0em; } .special-collapsible a { margin: 0; padding-top: 2px; padding-bottom: 2px; display: block; padding-left: 1em; border-bottom: 1px solid #BBBEAB; border-top: 1px solid #D2D3C6; color: #1E2B31; text-decoration: none; } #header h2 { display: none; } #license-areas { color: #E7E9DC; background: #4D5C63; } #license-areas a { color: #E7E9DC; background: #4D5C63; } table.charmap { background: white; border: #999 solid 1px; border-spacing: 2px; padding: .3em; table-collapse: collapse; } table.charmap tr td { text-align: center; } .wd-editor-toolbar-panel li.hseparator { background: url('http://tibasicdev.wikidot.com/local--files/home/toolbar-separator.png'); width: 22px; height: 22px; margin: 1px; } @media print { #print-head,#page-info, #license-area,#print-footer { display: none !important; } div#page-content:after { text-align: center; width: auto !important; display: block !important; margin: 2em 0 0; clear: both !important; padding-top: .5em; border-top: 1px solid #000; content: "TI-Basic Developer © 2006-2009 — \"A wiki for the TI-Basic beginner and advanced alike!\""; } } /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ /* END CSS ABOVE */ </style> <link rel="shortcut icon" href="/local--favicon/favicon.gif"/> <link rel="icon" type="image/gif" href="/local--favicon/favicon.gif"/> <link rel="alternate" type="application/wiki" title="Edit this page!" href="javascript:WIKIDOT.page.listeners.editClick()"/> <script type="text/javascript" src="http://static.wikidot.com/v--33/common--modules/js/misc/NewPageHelperModule.js"></script></head> <body id="html-body"> <div id="container-wrap"> <div id="container"> <div id="header"> <h1><a href="http://tibasicdev.wikidot.com/"><span>TI-Basic Developer</span></a></h1> <h2><span>The TI-Basic Information Repository</span></h2> <!-- google_ad_section_start(weight=ignore) --> <div id="search-top-box"> <form id="search-top-box-form" action="dummy"> <input id="search-top-box-input" class="text empty" type="text" size="15" name="query" value="search this site" onfocus="if(YAHOO.util.Dom.hasClass(this, 'empty')){YAHOO.util.Dom.removeClass(this,'empty'); this.value='';}"/><input class="button" type="submit" name="search" value="search"/> </form> </div> <div id="top-bar"> <ul><li>Membership <ul><li><a href="http://tibasicdev.wikidot.com/first-visit">First Time Visitor?</a></li><li><a href="http://tibasicdev.wikidot.com/conduct">Code of Conduct</a></li><li><a href="http://tibasicdev.wikidot.com/system:members">Site Members</a></li><li><a href="http://tibasicdev.wikidot.com/system:join">Become a Member</a></li><li><a href="http://tibasicdev.wikidot.com/system:invite">Invite a Friend</a></li></ul></li><li>Editing Pages <ul><li><a href="http://tibasicdev.wikidot.com/guide-to-editing">Guide to Editing</a></li><li><a href="http://tibasicdev.wikidot.com/conventions">Wiki Conventions</a></li><li><a href="http://www.wikidot.com/doc:wiki-syntax">Wiki Syntax</a></li><li><a href="http://tibasicdev.wikidot.com/to-do">To-Do List</a></li><li><a class="wiki-standalone-button" href="javascript:;" onclick="WIKIDOT.page.listeners.viewSourceClick(event)">View Page Source</a></li><li><a href="http://tibasicdev.wikidot.com/system:recent-changes">Recent Changes</a></li><li><a href="http://tibasicdev.wikidot.com/admin:manage">Site Manager</a></li></ul></li><li>Site Information <ul><li><a href="http://tibasicdev.wikidot.com/about">Site History</a></li><li><a href="http://tibasicdev.wikidot.com/logo">Site Logo</a></li><li><a href="http://tibasicdev.wikidot.com/all-news">News Archive</a></li><li><a href="http://tibasicdev.wikidot.com/news">83 News</a></li><li><a href="http://tibasicdev.wikidot.com/68k:news">68k News</a></li><li><a href="http://tibasicdev.wikidot.com/announcements">Announcements</a></li></ul></li><li>Related Sites <ul><li><a href="http://www.ticalc.org" onclick="window.open(this.href, '_blank'); return false;">ticalc.org</a></li><li><a href="http://www.unitedti.org" onclick="window.open(this.href, '_blank'); return false;">United-TI</a></li><li><a href="http://www.tifreakware.net/" onclick="window.open(this.href, '_blank'); return false;">TI-Freakware</a></li><li><a href="http://www.maxcoderz.org" onclick="window.open(this.href, '_blank'); return false;">MaxCoderz</a></li><li><a href="http://www.bgo.netfirms.com" onclick="window.open(this.href, '_blank'); return false;">BASIC Guru</a></li><li><a href="http://www.education.ti.com" onclick="window.open(this.href, '_blank'); return false;">Texas Instruments</a></li><li><a href="http://www.omnimaga.org" onclick="window.open(this.href, '_blank'); return false;">Omnimaga</a></li></ul></li></ul> </div> <div id="login-status"><span class="printuser"><a href="http://www.wikidot.com/user:info/james-kanjo" onclick="WIKIDOT.page.listeners.userInfo(35113); return false;" ><!--[if gte IE 7]><!--><img class="small" src="/common--images/avatars/35/35113/a16.png" alt="avatar" style="background-image:url(http://www.wikidot.com/userkarma.php?u=35113)"/><!--<![endif]--><!--[if lt IE 7]><img class="small" src="/common&#45;&#45;images/avatars/35/35113/a16.png" alt="avatar" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=35113,sizingMethod='scale')"/><![endif]--></a>James Kanjo</span> | <a href="http://www.wikidot.com/account:you">my account</a><a id="account-topbutton" href="javascript:;">&nabla;</a><div id="account-options"><ul><li><a href="http://www.wikidot.com/account:you">account summary</a></li><li><a href="http://www.wikidot.com/account:you/start/messages">private messages</a></li><li><a href="http://www.wikidot.com/account:you/start/contacts">my contacts</a></li><li><a href="http://www.wikidot.com/account:you/start/notifications">notifications</a></li><li><a href="http://www.wikidot.com/account:you/start/watching">watching</a></li><li><a href="javascript:;" onclick="WIKIDOT.page.listeners.logoutClick(event)">logout</a></li></ul></div></div> <div id="header-extra-div-1"><span></span></div><div id="header-extra-div-2"><span></span></div><div id="header-extra-div-3"><span></span></div> </div> <div id="content-wrap"> <div id="side-bar"> <div class="top"><ul><li><strong><a href="http://tibasicdev.wikidot.com/home">TI-83 Basic Home</a></strong></li><li><a href="http://tibasicdev.wikidot.com/68k:home">68k TI-Basic Home</a></li><li><a href="http://tibasicdev.wikidot.com/nspire">TI-Nspire Basic Page</a></li><li><a href="http://tibasicdev.wikidot.com/archives">Program Archives</a></li><li><a href="http://tibasicdev.wikidot.com/forum:home">Discussion Forums</a></li></ul></div><p><span style="font-size:large;">Preparation</span></p><ul><li><a href="http://tibasicdev.wikidot.com/thecalcs">The Calculators</a></li><li><a href="http://tibasicdev.wikidot.com/whytibasic">Why TI-Basic?</a></li><li><a href="http://tibasicdev.wikidot.com/using-this-guide">Using This Guide</a></li><li><a href="http://tibasicdev.wikidot.com/starter-kit">TI-Basic Starter Kit</a></li><li><a href="http://tibasicdev.wikidot.com/faq">TI-Basic FAQ</a></li></ul><p><span style="font-size:large;">Main Content</span></p><div class="special-collapsible"><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Commands</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Commands</a></div><div class="collapsible-block-content"><div class="list-pages-box"> <ul> <li><a href="http://tibasicdev.wikidot.com/commands">Overview</a></li> <li><a href="http://tibasicdev.wikidot.com/command-index">Command Index</a></li> <li><a href="http://tibasicdev.wikidot.com/geometpdf">Random command!</a></li> </ul> </div> <ul><li><a href="http://tibasicdev.wikidot.com/homescreen">Home Screen</a></li><li><a href="http://tibasicdev.wikidot.com/graphscreen">Graph Screen</a></li><li><a href="http://tibasicdev.wikidot.com/math">Math Functions</a></li><li><a href="http://tibasicdev.wikidot.com/variables">Variables</a></li><li><a href="http://tibasicdev.wikidot.com/userinput">User Input</a></li><li><a href="http://tibasicdev.wikidot.com/operators">Operators</a></li><li><a href="http://tibasicdev.wikidot.com/linking">Calculator Linking</a></li><li><a href="http://tibasicdev.wikidot.com/controlflow">Controlling Flow</a></li></ul></div></div></div><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Development</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Development</a></div><div class="collapsible-block-content"><ul><li><a href="http://tibasicdev.wikidot.com/development">Overview</a></li><li><a href="http://tibasicdev.wikidot.com/plan">Planning</a></li><li><a href="http://tibasicdev.wikidot.com/portability">Portability</a></li><li><a href="http://tibasicdev.wikidot.com/usability">Usability</a></li><li><a href="http://tibasicdev.wikidot.com/setup">Program Setup</a></li><li><a href="http://tibasicdev.wikidot.com/code-conventions">Code Conventions</a></li><li><a href="http://tibasicdev.wikidot.com/techniques">Techniques</a></li><li><a href="http://tibasicdev.wikidot.com/comments">Commenting Code</a></li><li><a href="http://tibasicdev.wikidot.com/subprograms">Subprograms</a></li><li><a href="http://tibasicdev.wikidot.com/cleanup">Program Cleanup</a></li><li><a href="http://tibasicdev.wikidot.com/debug">Debugging</a></li><li><a href="http://tibasicdev.wikidot.com/optimize">Optimization</a></li><li><a href="http://tibasicdev.wikidot.com/timings">Code Timings</a></li><li><a href="http://tibasicdev.wikidot.com/documentation">Writing Program Documentation</a></li><li><a href="http://tibasicdev.wikidot.com/marketing">Marketing</a></li><li><a href="http://tibasicdev.wikidot.com/releasing-your-program">Releasing Programs</a></li><li><a href="http://tibasicdev.wikidot.com/creating-new-program-versions">Creating New Program Versions</a></li></ul></div></div></div><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Techniques</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Techniques</a></div><div class="collapsible-block-content"><ul><li><a href="http://tibasicdev.wikidot.com/techniques">Overview</a></li><li><a href="http://tibasicdev.wikidot.com/animation">Animation</a></li><li><a href="http://tibasicdev.wikidot.com/assembly">Assembly</a></li><li><a href="http://tibasicdev.wikidot.com/compression">Compression Techniques</a></li><li><a href="http://tibasicdev.wikidot.com/cryptography">Cryptography</a></li><li><a href="http://tibasicdev.wikidot.com/custommenus">Custom Menus</a></li><li><a href="http://tibasicdev.wikidot.com/custominput">Custom Text Input</a></li><li><a href="http://tibasicdev.wikidot.com/easy-map-making">Easy Map Making</a></li><li><a href="http://tibasicdev.wikidot.com/friendly-window">Friendly Graphing Window</a></li><li><a href="http://tibasicdev.wikidot.com/graphics">Graphics</a></li><li><a href="http://tibasicdev.wikidot.com/grouping">Grouping A Program</a></li><li><a href="http://tibasicdev.wikidot.com/highscores">Highscores</a></li><li><a href="http://tibasicdev.wikidot.com/lookuptables">Look-Up Tables</a></li><li><a href="http://tibasicdev.wikidot.com/maps">Making Maps</a></li><li><a href="http://tibasicdev.wikidot.com/movement">Movement in Maps</a></li><li><a href="http://tibasicdev.wikidot.com/multiplayer">Multiplayer</a></li><li><a href="http://tibasicdev.wikidot.com/piecewise-expressions">Piecewise Expressions</a></li><li><a href="http://tibasicdev.wikidot.com/protection">Program Protection</a></li><li><a href="http://tibasicdev.wikidot.com/recursion">Recursion</a></li><li><a href="http://tibasicdev.wikidot.com/saving">Saving</a></li><li><a href="http://tibasicdev.wikidot.com/selfmodify">Self-Modifying Code (SMC)</a></li><li><a href="http://tibasicdev.wikidot.com/subprograms">Subprograms</a></li><li><a href="http://tibasicdev.wikidot.com/validation">Validation of User Input</a></li></ul></div></div></div><div class="collapsible-block"><div class="collapsible-block-folded"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">Miscellaneous</a></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">Miscellaneous</a></div><div class="collapsible-block-content"><ul><li><a href="http://tibasicdev.wikidot.com/experiment">Experiment</a></li><li><a href="http://tibasicdev.wikidot.com/programs-h">Programs</a></li><li><a href="http://tibasicdev.wikidot.com/sitemap">Sitemap</a></li></ul></div></div></div></div><div style="height: 5px;"></div><p><span style="font-size:large;">References</span></p><ul><li><a href="http://tibasicdev.wikidot.com/resources">Resources</a></li><li><a href="http://tibasicdev.wikidot.com/downloads">Downloads</a></li><li><a href="http://tibasicdev.wikidot.com/showcases">Showcases</a></li><li><a href="http://tibasicdev.wikidot.com/sidebar">Sidebar</a></li><li><a href="http://tibasicdev.wikidot.com/tokens">Token Size</a></li><li><a href="http://tibasicdev.wikidot.com/textsprites">Text Sprites</a></li><li><a href="http://tibasicdev.wikidot.com/binandhex">Binary &amp; Hex</a></li><li><a href="http://tibasicdev.wikidot.com/83lgfont">TI-83+ Font</a></li><li><a href="http://tibasicdev.wikidot.com/errors">Error Conditions</a></li><li><a href="http://tibasicdev.wikidot.com/file-extensions">File Extensions</a></li><li><a href="http://tibasicdev.wikidot.com/key-codes">Key Codes</a></li><li><a href="http://tibasicdev.wikidot.com/abbreviations">Abbreviations</a></li><li><a href="http://tibasicdev.wikidot.com/glossary">Glossary</a></li></ul><div class="collapsible-block"><div class="collapsible-block-folded"><span style="font-size:large;"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, true)">+&nbsp;Add&nbsp;Page</a></span></div><div class="collapsible-block-unfolded" style="display:none"><div class="collapsible-block-unfolded-link"><span style="font-size:large;"><a class="collapsible-block-link" href="javascript:;" onclick="WIKIDOT.page.listeners.toggleCollapsibleBlock(event, false)">-&nbsp;Add&nbsp;Page</a></span></div><div class="collapsible-block-content"><div style="text-align: center"> <form action="about:blank"> <select class="select" id="themePreviewerSelect" onchange="window.location.href=window.location.href.replace(/\?.*/, '').replace(/(\/theme_id\/[0-9]+)|$/, '/theme_id/'+$('themePreviewerSelect').value);">
<option  value="6651">Basic</option>
<option  value="6650">Bloo - no side bar</option>
<option  value="25">Cappuccino</option>
<option  value="26">Cappuccino - side bar on right</option>
<option  value="2">Clean</option>
<option  value="3">Clean - no side bar</option>
<option  value="56">Co</option>
<option  value="121">Co - no side bar</option>
<option  value="5">Flannel</option>
<option  value="9">Flannel Nature</option>
<option  value="10">Flannel Nature - no side bar</option>
<option  value="6">Flannel - no side bar</option>
<option  value="7">Flannel Ocean</option>
<option  value="8">Flannel Ocean - no side bar</option>
<option  value="57">Flower Blossom</option>
<option  value="75">Flower Blossom - no side bar</option>
<option  value="54">Gila</option>
<option  value="55">Gila - no side bar</option