**Various calc-dependent and AMS-dependent pseudo-constants**

This header file contains a set of various pseudo-constants (i.e. macros defined to
look and work like constants), dedicated to increase compatibility between the TI-89 and
TI-92 Plus and between AMS versions. These "constants" have different values on the
TI-89 and TI-92 Plus (or on AMS 1.xx and AMS 2.xx). Using these pseudo-constants,
you can, for example, perform keyboard reading and graphic calculations in a more sophisticated way,
check the AMS version and perform some AMS-dependent actions (although this is not recommended
if not really necessary), etc.

The following table shows all defined pseudo-constants.
A lot of them are known from DoorsOS, but they are defined here to work in both "nostub"
and "Doors" mode.

**PSEUDO_CONST_CALC**- A macro to construct a pseudo-constant from calculator-based values.
**PSEUDO_CONST_KBD**- A macro to construct a pseudo-constant from keyboard-based values.
**PSEUDO_CONST_SCREEN**- A macro to construct a pseudo-constant from screen-based values.

**AMS_1xx**- TRUE on AMS 1.xx, FALSE on AMS 2.xx and AMS 3.xx.
**AMS_2xx**- TRUE on AMS 2.xx, FALSE on AMS 1.xx and AMS 3.xx.
**AMS_3xx**- TRUE on AMS 3.xx, FALSE on AMS 1.xx and AMS 2.xx.
**CALCULATOR**- Describes the calculator model.
**HW_VERSION**- Describes the hardware version.
**KEY_DIAMOND**- The number added to the key code if the Diamond key is pressed with it (see ngetchx).
**KEY_DOWN**- Key code for the down arrow key (see ngetchx).
**KEY_DOWNLEFT**- Key code for simultaneous pressing of the down and left arrow keys (see ngetchx).
**KEY_LEFT**- Key code for the left arrow key (see ngetchx).
**KEY_OFF2**- The key code for Diamond+ON (see ngetchx).
**KEY_RIGHT**- Key code for the right arrow key (see ngetchx).
**KEY_SHIFT**- The number added to the key code if the Shift key is pressed with it (see ngetchx).
**KEY_UP**- Key code for the up arrow key (see ngetchx).
**KEY_UPRIGHT**- Key code for simultaneous pressing on up and right arrow keys (see ngetchx).
**LCD_HEIGHT**- Height of the screen in pixels.
**LCD_LINE_BYTES**- Number of bytes in the visible part of a screen line.
**LCD_WIDTH**- Width of the screen in pixels.
**ROM_base**- Base address of the ROM (0x200000 on TI-89 or V200, 0x400000 on TI-92 Plus, 0x800000 on TI-89 Titanium).
**RR_0**- A pseudo-constant pair for the '0' key.
**RR_1**- A pseudo-constant pair for the '1' key.
**RR_2**- A pseudo-constant pair for the '2' key.
**RR_3**- A pseudo-constant pair for the '3' key.
**RR_4**- A pseudo-constant pair for the '4' key.
**RR_5**- A pseudo-constant pair for the '5' key.
**RR_6**- A pseudo-constant pair for the '6' key.
**RR_7**- A pseudo-constant pair for the '7' key.
**RR_8**- A pseudo-constant pair for the '8' key.
**RR_9**- A pseudo-constant pair for the '9' key.
**RR_2ND**- A pseudo-constant pair for the '2nd' key.
**RR_A**- A pseudo-constant pair for the 'A' key.
**RR_ALPHA**- A pseudo-constant pair for the Alpha key.
**RR_APPS**- A pseudo-constant pair for the 'APPS' key.
**RR_B**- A pseudo-constant pair for the 'B' key.
**RR_BCKSPC**- A pseudo-constant pair for the backspace key.
**RR_C**- A pseudo-constant pair for the 'C' key.
**RR_CATALOG**- A pseudo-constant pair for the 'CATALOG' key.
**RR_CLEAR**- A pseudo-constant pair for the 'CLEAR' key.
**RR_COMMA**- A pseudo-constant pair for the ',' key.
**RR_COS**- A pseudo-constant pair for the 'COS' key.
**RR_D**- A pseudo-constant pair for the 'D' key.
**RR_DIAMOND**- A pseudo-constant pair for the Diamond key.
**RR_DIVIDE**- A pseudo-constant pair for the '/' key.
**RR_DOT**- A pseudo-constant pair for the '.' key.
**RR_DOWN**- A pseudo-constant pair for the down arrow key.
**RR_E**- A pseudo-constant pair for the 'E' key.
**RR_EE**- A pseudo-constant pair for the 'EE' key.
**RR_ENTER1**- A pseudo-constant pair for the first 'ENTER' key.
**RR_ENTER2**- A pseudo-constant pair for the second 'ENTER' key.
**RR_ENTER**- A pseudo-constant pair for the 'ENTER' key.
**RR_EQUALS**- A pseudo-constant pair for the '=' key.
**RR_ESC**- A pseudo-constant pair for the 'ESC' key.
**RR_F1**- A pseudo-constant pair for the 'F1' key.
**RR_F2**- A pseudo-constant pair for the 'F2' key.
**RR_F3**- A pseudo-constant pair for the 'F3' key.
**RR_F4**- A pseudo-constant pair for the 'F4' key.
**RR_F5**- A pseudo-constant pair for the 'F5' key.
**RR_F6**- A pseudo-constant pair for the 'F6' key.
**RR_F7**- A pseudo-constant pair for the 'F7' key.
**RR_F8**- A pseudo-constant pair for the 'F8' key.
**RR_F**- A pseudo-constant pair for the 'F' key.
**RR_G**- A pseudo-constant pair for the 'G' key.
**RR_H**- A pseudo-constant pair for the 'H' key.
**RR_HAND**- A pseudo-constant pair for the Hand key.
**RR_HOME**- A pseudo-constant pair for the 'HOME' key.
**RR_I**- A pseudo-constant pair for the 'I' key.
**RR_J**- A pseudo-constant pair for the 'J' key.
**RR_K**- A pseudo-constant pair for the 'K' key.
**RR_L**- A pseudo-constant pair for the 'L' key.
**RR_LEFT**- A pseudo-constant pair for the left arrow key.
**RR_LN**- A pseudo-constant pair for the 'LN' key.
**RR_M**- A pseudo-constant pair for the 'M' key.
**RR_MINUS**- A pseudo-constant pair for the '-' key.
**RR_MODE**- A pseudo-constant pair for the 'MODE' key.
**RR_MULTIPLY**- A pseudo-constant pair for the '*' key.
**RR_N**- A pseudo-constant pair for the 'N' key.
**RR_NEGATE**- A pseudo-constant pair for the negation key.
**RR_NO_KEY**- A constant which means that a specific key does not exist.
**RR_O**- A pseudo-constant pair for the 'O' key.
**RR_P**- A pseudo-constant pair for the 'P' key.
**RR_PAREN_CLOSE**- A pseudo-constant pair for the ')' key.
**RR_PAREN_OPEN**- A pseudo-constant pair for the '(' key.
**RR_PLUS**- A pseudo-constant pair for the '+' key.
**RR_POWER**- A pseudo-constant pair for the '^' key.
**RR_Q**- A pseudo-constant pair for the 'Q' key.
**RR_R**- A pseudo-constant pair for the 'R' key.
**RR_RIGHT**- A pseudo-constant pair for the right arrow key.
**RR_S**- A pseudo-constant pair for the 'S' key.
**RR_SHIFT**- A pseudo-constant pair for the Shift key.
**RR_SIN**- A pseudo-constant pair for the 'SIN' key.
**RR_SPACE**- A pseudo-constant pair for the space key.
**RR_STORE**- A pseudo-constant pair for the Store key.
**RR_T**- A pseudo-constant pair for the 'T' key.
**RR_TAN**- A pseudo-constant pair for the 'TAN' key.
**RR_THETA**- A pseudo-constant pair for the 'q' key.
**RR_U**- A pseudo-constant pair for the 'U' key.
**RR_UP**- A pseudo-constant pair for the up arrow key.
**RR_V**- A pseudo-constant pair for the 'V' key.
**RR_W**- A pseudo-constant pair for the 'W' key.
**RR_WITH**- A pseudo-constant pair for the '|' key.
**RR_X**- A pseudo-constant pair for the 'X' key.
**RR_Y**- A pseudo-constant pair for the 'Y' key.
**RR_Z**- A pseudo-constant pair for the 'Z' key.
**TI89_CLASSIC**- TRUE on a classic TI-89 (i.e. a TI-89 which is
*not*a TI-89 Titanium), FALSE otherwise. **TI89_TITANIUM**- TRUE on a TI-89 Titanium, FALSE otherwise.
**TI89**- TRUE on a TI-89, FALSE otherwise.
**TI92PLUS**- TRUE on TI-92 Plus, FALSE otherwise.
**TIOS_entries**- Number of entries in the TIOS jump table.
**V200**- TRUE on V200, FALSE otherwise.

**Note:** All of these pseudo-constants are in fact macros. Although they expand to relatively small
code (in "Doors" mode they are mainly implemented as RAM calls and managed by kernel), it is recommended to
store a pseudo-constant in an ordinary variable if you use it a lot of times in the program (especially in "nostub"
mode), and to use this variable instead. For example, if you use the KEY_LEFT pseudo-constant
too often, it is recommended to define

int key_left = KEY_LEFT;

somewhere at the beginning of the program, and to use

if (key == key_left) ...

instead of

if (key == KEY_LEFT) ...

Such indirection will save memory, but note that this is necessary only if you use
the same pseudo-constant a lot in the program (say, more than 5 times).

There is yet another note. Pseudo-Constants work as constants in nearly all cases, but
they are not really constants, so they cannot be used in **case** labels
inside **switch** statements, i.e. the following is not legal:

switch (ngetchx ()) { case KEY_LEFT: ... case KEY_RIGHT: ... ... }

Instead, use **if...else** constructions:

key = ngetchx (); if (key == KEY_LEFT) { ... } else if (key == KEY_RIGHT) { ... } ...

The pseudo-constants really become constants if you compile only for one
calculator model. For example, if you define `USE_TI89`

and nothing
else, CALCULATOR will have the value `0`

,
and all other pseudo-constants will be optimized into single values.
Or, if you define `MIN_AMS`

to be `200`

,
AMS_1xx will always be false.

#define PSEUDO_CONST_CALC(calc92,calc89,calc92plus,calcv200) (CALCULATOR ? ((CALCULATOR == 1) ? (calc92plus) : (calcv200)) : (calc89)) |

**A macro to construct a pseudo-constant from calculator-based values.**

PSEUDO_CONST_CALC is a macro used by
PSEUDO_CONST_SCREEN and
PSEUDO_CONST_KBD. Most of the time,
you should not use it directly, but use these two macros instead.

It takes several values for the different calculators that GCC4TI can
currently compile code for, and returns one of them based on the calculator
that the program currently uses.
The values must be plain positive integers up to 65535 (0xFFFF) in decimal
or hexadecimal notation, otherwise this macro may fail in some cases.

Uses of this macro may be optimized by defining
`OPTIMIZE_CALC_CONSTS`

.

See also: PSEUDO_CONST_SCREEN, PSEUDO_CONST_KBD

#define PSEUDO_CONST_KBD(kbd89,kbd92) PSEUDO_CONST_CALC(kbd92, kbd89, kbd92, kbd92) |

**A macro to construct a pseudo-constant from keyboard-based values.**

PSEUDO_CONST_KBD takes several values for different keyboard layouts, and
returns one of them based on the keyboard that the program currently uses.
The values must be plain positive integers up to 65535 (0xFFFF) in decimal
or hexadecimal notation, otherwise this macro may fail in some cases.

Currently, there are two different keyboard layouts: The TI-89 keyboard,
which looks like a normal calculator keyboard with extra keys, and the
TI-92/TI-92+/V200 keyboard, which has a QWERTY layout.
The two parameters specify the values to use whichever keyboard layout is
encountered, which means that the number of parameters may increase as new
hardware becomes available. If you want to use this macro in your
application, you must decide for yourself whether this feature is desirable:
On the one hand, it can prevent your code from being compiled in future
releases of GCC4TI; on the other hand, you can easily port your programs to
new hardware just by fixing all of the compile-time errors.

See also: PSEUDO_CONST_CALC, PSEUDO_CONST_SCREEN

#define PSEUDO_CONST_SCREEN(screen89,screen92) PSEUDO_CONST_CALC(screen92, screen89, screen92, screen92) |

**A macro to construct a pseudo-constant from screen-based values.**

PSEUDO_CONST_SCREEN takes several values for different types of screens, and
returns one of them based on the screen that the program currently uses.
The values must be plain positive integers up to 65535 (0xFFFF) in decimal
or hexadecimal notation, otherwise this macro may fail in some cases.

Currently, there are two types of screens: The TI-89 LCD with a size of
160x100 pixels, and the TI-92/TI-92+/V200 LCD with a size of 240x128 pixels.
The two parameters specify the values to use whichever screen type is
encountered, which means that the number of parameters may increase as new
hardware becomes available. If you want to use this macro in your
application, you must decide for yourself whether this feature is desirable:
On the one hand, it can prevent your code from being compiled in future
releases of GCC4TI; on the other hand, you can easily port your programs to
new hardware just by fixing all of the compile-time errors.

See also: PSEUDO_CONST_CALC, PSEUDO_CONST_KBD

**TRUE on AMS 1.xx, FALSE on AMS 2.xx and AMS 3.xx.**

This pseudo-constant is in fact defined globally, in default.h.

**TRUE on AMS 2.xx, FALSE on AMS 1.xx and AMS 3.xx.**

This pseudo-constant is in fact defined globally, in default.h.

**TRUE on AMS 3.xx, FALSE on AMS 1.xx and AMS 2.xx.**

This pseudo-constant is in fact defined globally, in default.h.

**Describes the calculator model.**

This pseudo-constant is 0 on the TI-89, 1 on the TI-92 Plus, and 3 on the V200.

**Describes the hardware version.**

This pseudo-constant is 1 on a HW1 calculator and 2 on a HW2 calculator.
It reads the value of the *gateArray* field in the
HARDWARE_PARM_BLOCK
structure returned by
FL_getHardwareParmBlock.

#define KEY_DIAMOND (PSEUDO_CONST_KBD (16384, 8192)) |

**The number added to the key code if the Diamond key is pressed with it (see ngetchx).**

#define KEY_DOWN (PSEUDO_CONST_KBD (340, 344)) |

**Key code for the down arrow key (see ngetchx).**

#define KEY_DOWNLEFT (PSEUDO_CONST_KBD (342, 345)) |

**Key code for simultaneous pressing of the down and left arrow keys (see ngetchx).**

#define KEY_LEFT (PSEUDO_CONST_KBD (338, 337)) |

**Key code for the left arrow key (see ngetchx).**

#define KEY_OFF2 (PSEUDO_CONST_KBD (16651, 8459)) |

**The key code for Diamond+ON (see ngetchx).**

#define KEY_RIGHT (PSEUDO_CONST_KBD (344, 340)) |

**Key code for the right arrow key (see ngetchx).**

#define KEY_SHIFT (PSEUDO_CONST_KBD (8192, 16384)) |

**The number added to the key code if the Shift key is pressed with it (see ngetchx).**

#define KEY_UP (PSEUDO_CONST_KBD (337, 338)) |

**Key code for the up arrow key (see ngetchx).**

#define KEY_UPRIGHT (PSEUDO_CONST_KBD (345, 342)) |

**Key code for simultaneous pressing on up and right arrow keys (see ngetchx).**

#define LCD_HEIGHT (PSEUDO_CONST_SCREEN (100, 128)) |

**Height of the screen in pixels.**

This value is 100 on the TI-89, and 128 on the TI-92 Plus and V200.

#define LCD_LINE_BYTES (PSEUDO_CONST_SCREEN (20, 30)) |

**Number of bytes in the visible part of a screen line.**

This value is 20 on the TI-89, and 30 on the TI-92 Plus and V200.

#define LCD_WIDTH (PSEUDO_CONST_SCREEN (160, 240)) |

**Width of the screen in pixels.**

This value is 160 on the TI-89, and 240 on the TI-92 Plus and V200.

**Base address of the ROM (0x200000 on TI-89 or V200, 0x400000 on TI-92 Plus, 0x800000 on TI-89 Titanium).**

#define RR_0 (PSEUDO_CONST_KBD (4, 9)), (PSEUDO_CONST_KBD (0, 5)) |

**A pseudo-constant pair for the '0' key.**

This pseudo-constant pair defines the location of a specific key in the keyboard matrix used in _keytest.

#define RR_1 (PSEUDO_CONST_KBD (4, 1)), (PSEUDO_CONST_KBD (1, 5)) |

**A pseudo-constant pair for the '1' key.**

This pseudo-constant pair defines the location of a specific key in the keyboard matrix used in _keytest.

#define RR_2 (PSEUDO_CONST_KBD (3, 1)), (PSEUDO_CONST_KBD (1, 6)) |

**A pseudo-constant pair for the '2' key.**

This pseudo-constant pair defines the location of a specific key in the keyboard matrix used in _keytest.

#define RR_3 (PSEUDO_CONST_KBD (2, 1)), (PSEUDO_CONST_KBD (1, 7)) |

**A pseudo-constant pair for the '3' key.**

#define RR_4 (PSEUDO_CONST_KBD (4, 2)), (PSEUDO_CONST_KBD (2, 5)) |

**A pseudo-constant pair for the '4' key.**

#define RR_5 (PSEUDO_CONST_KBD (3, 2)), (PSEUDO_CONST_KBD (2, 6)) |

**A pseudo-constant pair for the '5' key.**

#define RR_6 2, (PSEUDO_CONST_KBD (2, 7)) |

**A pseudo-constant pair for the '6' key.**

#define RR_7 (PSEUDO_CONST_KBD (4, 3)), (PSEUDO_CONST_KBD (3, 5)) |

**A pseudo-constant pair for the '7' key.**

#define RR_8 3, (PSEUDO_CONST_KBD (3, 6)) |

**A pseudo-constant pair for the '8' key.**

#define RR_9 (PSEUDO_CONST_KBD (2, 3)), (PSEUDO_CONST_KBD (3, 7)) |

**A pseudo-constant pair for the '9' key.**

#define RR_2ND 0, (PSEUDO_CONST_KBD (4, 0)) |

**A pseudo-constant pair for the '2nd' key.**

#define RR_A (PSEUDO_CONST_KBD (RR_NO_KEY, 9)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'A' key.**

#define RR_ALPHA (PSEUDO_CONST_KBD (0, RR_NO_KEY)), (PSEUDO_CONST_KBD (7, RR_NO_KEY)) |

**A pseudo-constant pair for the Alpha key.**

#define RR_APPS (PSEUDO_CONST_KBD (5, 7)), (PSEUDO_CONST_KBD (0, 6)) |

**A pseudo-constant pair for the 'APPS' key.**

#define RR_B (PSEUDO_CONST_KBD (RR_NO_KEY, 5)), (PSEUDO_CONST_KBD (RR_NO_KEY, 1)) |

**A pseudo-constant pair for the 'B' key.**

#define RR_BCKSPC (PSEUDO_CONST_KBD (2, 8)), (PSEUDO_CONST_KBD (6, 0)) |

**A pseudo-constant pair for the backspace key.**

#define RR_C (PSEUDO_CONST_KBD (RR_NO_KEY, 3)), (PSEUDO_CONST_KBD (RR_NO_KEY, 1)) |

**A pseudo-constant pair for the 'C' key.**

#define RR_CATALOG (PSEUDO_CONST_KBD (3, RR_NO_KEY)), (PSEUDO_CONST_KBD (6, RR_NO_KEY)) |

**A pseudo-constant pair for the 'CATALOG' key.**

#define RR_CLEAR (PSEUDO_CONST_KBD (1, 7)), (PSEUDO_CONST_KBD (6, 5)) |

**A pseudo-constant pair for the 'CLEAR' key.**

#define RR_COMMA (PSEUDO_CONST_KBD (2, 4)), (PSEUDO_CONST_KBD (4, 7)) |

**A pseudo-constant pair for the ',' key.**

#define RR_COS (PSEUDO_CONST_KBD (RR_NO_KEY, 5)), (PSEUDO_CONST_KBD (RR_NO_KEY, 6)) |

**A pseudo-constant pair for the 'COS' key.**

#define RR_D (PSEUDO_CONST_KBD (RR_NO_KEY, 2)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'D' key.**

#define RR_DIAMOND 0, (PSEUDO_CONST_KBD (6, 1)) |

**A pseudo-constant pair for the Diamond key.**

#define RR_DIVIDE (PSEUDO_CONST_KBD (1, 5)), (PSEUDO_CONST_KBD (4, 0)) |

**A pseudo-constant pair for the '/' key.**

#define RR_DOT (PSEUDO_CONST_KBD (3, 9)), (PSEUDO_CONST_KBD (0, 6)) |

**A pseudo-constant pair for the '.' key.**

#define RR_DOWN 0, (PSEUDO_CONST_KBD (2, 7)) |

**A pseudo-constant pair for the down arrow key.**

#define RR_E (PSEUDO_CONST_KBD (RR_NO_KEY, 2)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the 'E' key.**

#define RR_EE (PSEUDO_CONST_KBD (5, RR_NO_KEY)), (PSEUDO_CONST_KBD (2, RR_NO_KEY)) |

**A pseudo-constant pair for the 'EE' key.**

#define RR_ENTER1 (PSEUDO_CONST_KBD (1, 9)), (PSEUDO_CONST_KBD (0, 1)) |

**A pseudo-constant pair for the first 'ENTER' key.**

#define RR_ENTER2 (PSEUDO_CONST_KBD (1, 6)), (PSEUDO_CONST_KBD (0, 6)) |

**A pseudo-constant pair for the second 'ENTER' key.**

#define RR_ENTER RR_ENTER1 |

**A pseudo-constant pair for the 'ENTER' key.**

#define RR_EQUALS (PSEUDO_CONST_KBD (5, 7)), (PSEUDO_CONST_KBD (4, 0)) |

**A pseudo-constant pair for the '=' key.**

#define RR_ESC (PSEUDO_CONST_KBD (6, 8)), (PSEUDO_CONST_KBD (0, 6)) |

**A pseudo-constant pair for the 'ESC' key.**

#define RR_F1 (PSEUDO_CONST_KBD (5, 6)), (PSEUDO_CONST_KBD (7, 4)) |

**A pseudo-constant pair for the 'F1' key.**

#define RR_F2 4, (PSEUDO_CONST_KBD (7, 4)) |

**A pseudo-constant pair for the 'F2' key.**

#define RR_F3 (PSEUDO_CONST_KBD (3, 2)), (PSEUDO_CONST_KBD (7, 4)) |

**A pseudo-constant pair for the 'F3' key.**

#define RR_F4 (PSEUDO_CONST_KBD (2, 9)), (PSEUDO_CONST_KBD (7, 4)) |

**A pseudo-constant pair for the 'F4' key.**

#define RR_F5 (PSEUDO_CONST_KBD (1, 7)), (PSEUDO_CONST_KBD (7, 4)) |

**A pseudo-constant pair for the 'F5' key.**

#define RR_F6 (PSEUDO_CONST_KBD (RR_NO_KEY, 5)), (PSEUDO_CONST_KBD (RR_NO_KEY, 4)) |

**A pseudo-constant pair for the 'F6' key.**

#define RR_F7 (PSEUDO_CONST_KBD (RR_NO_KEY, 3)), (PSEUDO_CONST_KBD (RR_NO_KEY, 4)) |

**A pseudo-constant pair for the 'F7' key.**

#define RR_F8 (PSEUDO_CONST_KBD (RR_NO_KEY, 1)), (PSEUDO_CONST_KBD (RR_NO_KEY, 4)) |

**A pseudo-constant pair for the 'F8' key.**

#define RR_F (PSEUDO_CONST_KBD (RR_NO_KEY, 3)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'F' key.**

#define RR_G (PSEUDO_CONST_KBD (RR_NO_KEY, 4)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'G' key.**

#define RR_H (PSEUDO_CONST_KBD (RR_NO_KEY, 5)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'H' key.**

#define RR_HAND (PSEUDO_CONST_KBD (RR_NO_KEY, 0)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the Hand key.**

#define RR_HOME (PSEUDO_CONST_KBD (5, RR_NO_KEY)), (PSEUDO_CONST_KBD (6, RR_NO_KEY)) |

**A pseudo-constant pair for the 'HOME' key.**

#define RR_I (PSEUDO_CONST_KBD (RR_NO_KEY, 7)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the 'I' key.**

#define RR_J (PSEUDO_CONST_KBD (RR_NO_KEY, 6)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'J' key.**

#define RR_K (PSEUDO_CONST_KBD (RR_NO_KEY, 7)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'K' key.**

#define RR_L (PSEUDO_CONST_KBD (RR_NO_KEY, 8)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'L' key.**

#define RR_LEFT 0, (PSEUDO_CONST_KBD (1, 4)) |

**A pseudo-constant pair for the left arrow key.**

#define RR_LN (PSEUDO_CONST_KBD (RR_NO_KEY, 6)), (PSEUDO_CONST_KBD (RR_NO_KEY, 5)) |

**A pseudo-constant pair for the 'LN' key.**

#define RR_M (PSEUDO_CONST_KBD (RR_NO_KEY, 7)), (PSEUDO_CONST_KBD (RR_NO_KEY, 1)) |

**A pseudo-constant pair for the 'M' key.**

#define RR_MINUS (PSEUDO_CONST_KBD (1, 9)), (PSEUDO_CONST_KBD (2, 0)) |

**A pseudo-constant pair for the '-' key.**

#define RR_MODE (PSEUDO_CONST_KBD (4, 8)), (PSEUDO_CONST_KBD (6, 5)) |

**A pseudo-constant pair for the 'MODE' key.**

#define RR_MULTIPLY (PSEUDO_CONST_KBD (1, 7)), (PSEUDO_CONST_KBD (3, 7)) |

**A pseudo-constant pair for the '*' key.**

#define RR_N (PSEUDO_CONST_KBD (RR_NO_KEY, 6)), (PSEUDO_CONST_KBD (RR_NO_KEY, 1)) |

**A pseudo-constant pair for the 'N' key.**

#define RR_NEGATE (PSEUDO_CONST_KBD (2, 9)), (PSEUDO_CONST_KBD (0, 7)) |

**A pseudo-constant pair for the negation key.**

#define RR_NO_KEY 0xF |

**A constant which means that a specific key does not exist.**

This constant is used whenever a specific key only exists on one calculator.

#define RR_O (PSEUDO_CONST_KBD (RR_NO_KEY, 8)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the 'O' key.**

#define RR_P (PSEUDO_CONST_KBD (RR_NO_KEY, 6)), (PSEUDO_CONST_KBD (RR_NO_KEY, 7)) |

**A pseudo-constant pair for the 'P' key.**

#define RR_PAREN_CLOSE (PSEUDO_CONST_KBD (3, 4)), (PSEUDO_CONST_KBD (4, 6)) |

**A pseudo-constant pair for the ')' key.**

#define RR_PAREN_OPEN 4, (PSEUDO_CONST_KBD (4, 5)) |

**A pseudo-constant pair for the '(' key.**

#define RR_PLUS (PSEUDO_CONST_KBD (1, 8)), (PSEUDO_CONST_KBD (1, 4)) |

**A pseudo-constant pair for the '+' key.**

#define RR_POWER (PSEUDO_CONST_KBD (1, 6)), (PSEUDO_CONST_KBD (5, 0)) |

**A pseudo-constant pair for the '^' key.**

#define RR_Q (PSEUDO_CONST_KBD (RR_NO_KEY, 9)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the 'Q' key.**

#define RR_R (PSEUDO_CONST_KBD (RR_NO_KEY, 3)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the 'R' key.**

#define RR_RIGHT 0, (PSEUDO_CONST_KBD (3, 6)) |

**A pseudo-constant pair for the right arrow key.**

#define RR_S (PSEUDO_CONST_KBD (RR_NO_KEY, 1)), (PSEUDO_CONST_KBD (RR_NO_KEY, 2)) |

**A pseudo-constant pair for the 'S' key.**

#define RR_SHIFT 0, (PSEUDO_CONST_KBD (5, 2)) |

**A pseudo-constant pair for the Shift key.**

#define RR_SIN (PSEUDO_CONST_KBD (RR_NO_KEY, 5)), (PSEUDO_CONST_KBD (RR_NO_KEY, 5)) |

**A pseudo-constant pair for the 'SIN' key.**

#define RR_SPACE (PSEUDO_CONST_KBD (RR_NO_KEY, 4)), (PSEUDO_CONST_KBD (RR_NO_KEY, 0)) |

**A pseudo-constant pair for the space key.**

#define RR_STORE (PSEUDO_CONST_KBD (5, 3)), (PSEUDO_CONST_KBD (1, 0)) |

**A pseudo-constant pair for the Store key.**

#define RR_T (PSEUDO_CONST_KBD (2, 4)), (PSEUDO_CONST_KBD (5, 3)) |

**A pseudo-constant pair for the 'T' key.**

#define RR_TAN (PSEUDO_CONST_KBD (RR_NO_KEY, 5)), (PSEUDO_CONST_KBD (RR_NO_KEY, 7)) |

**A pseudo-constant pair for the 'TAN' key.**

#define RR_THETA (PSEUDO_CONST_KBD (RR_NO_KEY, 8)), (PSEUDO_CONST_KBD (RR_NO_KEY, 1)) |

**A pseudo-constant pair for the 'q' key.**

#define RR_U (PSEUDO_CONST_KBD (RR_NO_KEY, 6)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the 'U' key.**

#define RR_UP 0, (PSEUDO_CONST_KBD (0, 5)) |

**A pseudo-constant pair for the up arrow key.**

#define RR_V (PSEUDO_CONST_KBD (RR_NO_KEY, 4)), (PSEUDO_CONST_KBD (RR_NO_KEY, 1)) |

**A pseudo-constant pair for the 'V' key.**

#define RR_W (PSEUDO_CONST_KBD (RR_NO_KEY, 1)), (PSEUDO_CONST_KBD (RR_NO_KEY, 3)) |

**A pseudo-constant pair for the 'W' key.**

#define RR_WITH (PSEUDO_CONST_KBD (5, RR_NO_KEY)), (PSEUDO_CONST_KBD (3, RR_NO_KEY)) |

**A pseudo-constant pair for the '|' key.**

#define RR_X (PSEUDO_CONST_KBD (5, 2)), (PSEUDO_CONST_KBD (5, 1)) |

**A pseudo-constant pair for the 'X' key.**

#define RR_Y (PSEUDO_CONST_KBD (4, 5)), (PSEUDO_CONST_KBD (5, 3)) |

**A pseudo-constant pair for the 'Y' key.**

#define RR_Z (PSEUDO_CONST_KBD (3, 1)), (PSEUDO_CONST_KBD (5, 1)) |

**A pseudo-constant pair for the 'Z' key.**

#define TI89_CLASSIC (TI89 && HW_VERSION<3) |

**TRUE on a classic TI-89 (i.e. a TI-89 which is not a TI-89 Titanium), FALSE otherwise.**

See also: TI89

#define TI89_TITANIUM (TI89 && HW_VERSION>=3) |

**TRUE on a TI-89 Titanium, FALSE otherwise.**

See also: TI89

#define TI89 (CALCULATOR == 0) |

**TRUE on a TI-89, FALSE otherwise.**

See also: TI89_CLASSIC, TI89_TITANIUM

#define TI92PLUS (CALCULATOR == 1) |

**TRUE on TI-92 Plus, FALSE otherwise.**

**Number of entries in the TIOS jump table.**

This pseudo-constant may also be used to determine the AMS version:

684 | 0x2AC | AMS 1.00 (TI-92 Plus only) |

972 | 0x3CC | AMS 1.01 (or 1.00 for TI-89), AMS 1.05 |

1288 | 0x508 | AMS 2.01 |

1463 | 0x5B7 | AMS 2.02, AMS 2.03 |

1506 | 0x5E2 | AMS 2.04 |

1519 | 0x5EF | AMS 2.05 |

1543 | 0x607 | AMS 2.06 (internal beta), 2.07, 2.08, 2.09 |

1544 | 0x608 | AMS 3.00, 3.01 |

It is, in fact, defined globally, in default.h.

You can precisely determine the AMS version using ReleaseVersion.

#define V200 (CALCULATOR == 3) |

**TRUE on V200, FALSE otherwise.**