The VAT starts immediately before the end of the hardware stack and is divided
into two parts. The first part holds the names of real, complex, matrix, picture, GDB,
and equation type variables. This region starts immediately after the Hardware Stack at
the fixed address SymTable.
The second part holds programs, lists, groups, and AppVars. The beginning is stored in
the variable (ProgPtr) and ends at (PTemp)+1.
| -14 | -13 | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Variable name — Eight tokens maximum | NL | Page | DAH | DAL | Ver | T2 | T | |||||||
| -13 | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| F# | List name — 5 tokens max | tVarLst | NL | Page | DAH | DAL | Ver | T2 | T | ||||
| -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
|---|---|---|---|---|---|---|---|---|
| $00 | Second name token |
First name token |
Page | DAH | DAL | Ver | T2 | T |
| T | The object type and system effects:
| ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| T2 | Reserved for future use | ||||||||||
| Ver | Version number. If a future TI-83 Plus version introduces a new variable format, this is used to prevent sending that variable to an older version. | ||||||||||
| DAL DAH |
Pointer to the data. DAL is the least-significant byte, and DAH is the most-significant. | ||||||||||
| Page | The ROM page the variable is archived on. If the variable is in RAM, then 0. | ||||||||||
| NL | The length of the name. For lists, tVarLst is included in this value. | ||||||||||
| F# | Number of a formula attached to a list, or 0 if no formula |
The structure of a list formula is
| -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
|---|---|---|---|---|---|---|---|---|
| $00 | F# | $3F | Page | DAH | DAL | Ver | T2 | EquObj |
RES AppTextSave, (IY + AppFlags)
b_call(_ClrLCDFull)
LD HL, (ProgPtr) ; Start of Symbol Table for programs
MainLoop:
LD DE, 0
LD (CurRow), DE
LD C, 7 ; Counter. We can display 7 variables per screen
FindLoop:
LD DE, (PTemp) ; Check to see if we're at the end of the symbol table
OR A
SBC HL, DE
JR Z, Done
JR C, Done
ADD HL, DE ; Restore HL
LD A, (HL) ; Check the [T] of entry, take appropriate action
AND $1F ; Bitmask off bits 7-5 to get type only.
CP ProgObj
JR Z, IsNormalProg
CP ProtProgObj
JR NZ, Skip
LD A, '#' ; We'll use a hash to signify a protected program...
JR DispStatus
IsNormalProg:
LD A, ' ' ; ...or space padding for a normal program
DispStatus:
b_call(_PutC) ; Display protection status
; At this point, HL -> [T], so we'll move back six bytes to [NL]
LD DE, -6
ADD HL, DE
LD B, (HL) ; Store number of characters in name for DJNZ
DispNameLoop:
DEC HL
LD A, (HL)
b_call(_PutC)
DJNZ DispNameLoop
DEC HL ; Move back one byte so HL -> [T] of next entry
b_call(_NewLine)
DEC C ; Subtract counter
JR NZ, FindLoop
PUSH HL
b_call(_GetKey) ; Press any key...
b_call(_ClrLCDFull)
POP HL
JR MainLoop
Skip:
; Skip an entry
OR A
LD DE, 6
SBC HL, DE
LD E, (HL) ; Put name length in E to skip
INC E ; Add 1 to go to [T] of next entry
SBC HL, DE
JR FindLoop
Done:
b_call(_GetKey)
SET AppTextSave, (IY + AppFlags)
RET ; That's all folks!