Conventions and evidence
This page defines the notation, evidence labels, and naming conventions used throughout the wiki.
Suggested reading order
- System overview introduces the machine, OS, and evidence model.
- Subsystem map shows the major services and their dependencies.
- Memory map, Paging, The bcall mechanism, and Interrupts cover the shared architecture.
- Continue with a core subsystem such as Floating point, Variables and the VAT, Tokenizer and TI-BASIC tokens, or Display and LCD, followed by its linked deep dives.
- Glossary for any unfamiliar term.
Address notation
pp:addr— Flash pagepp(00–3F) and logical addressaddr. Banked pages run in the0x4000–0x7FFFwindow, so_PutSat01:5C39means page01, address0x5C39.ram:addr— page 0 (the always-mapped kernel) and the RAM window; Ghidra keeps page 0 in itsramspace, soram:229E≡00:229E.- Ghidra’s overlay space writes flash addresses as
page_pp:addr(e.g.page_38:4000); the wiki normalizes these to the shortpp:addrform, sopage_38:4000is written38:4000. - A bare
0x….(no page) is a RAM data address or an unpaged value (e.g.flags0x89F0, the bcall-ID ranges0x4xxx/0x8xxx, a page number like0x3B). - bcall ID ≠ address. A bcall has an ID (the 2-byte word after
rst 28h, such as_FindSym=0x42F4) and a body address (00:0E65). The ID indexes the jump table; it is not where the code lives.
Confidence flags
Every non-obvious claim is tagged:
| Flag | Meaning |
|---|---|
| [confirmed] | Directly observed in this ROM’s disassembly, decompiler, raw bytes, generated database, or a labeled execution trace. |
| [standard] | Matches the publicly-documented TI-83+/84+ architecture and is consistent with the disassembly, but not every byte was traced. |
| [hypothesis] | Inferred / not yet verified — treat with caution. |
Function naming
_CamelCase— an official TI bcall/equate name (fromti83plus.inc, the full 2007 TI-83 Plus SDK equates file, or the TI SDK), e.g._FindSym,_FPAdd. High confidence.snake_case— a name inferred from a routine’s behavior, including its callees and RAM or port accesses, such asfindsym_scanorfp_normalize. Any individual low-level helper name remains a best-effort interpretation.
The rebuilt Ghidra project keeps each kind of name in a separate checked registry:
tools/symbols/names.txtcontains function entries. Its importer disassembles the entry and creates a function.tools/symbols/labels.txtcontains ROM data and internal code-entry labels. Rows markedentryseed and preserve disassembly without creating an overlapping function.tools/symbols/ram.txtcontains RAM symbols, including official SDK equates and carefully named inferred state.tools/symbols/ports.txtcontains I/O-port symbols.tools/symbols/poffsets.txtcontains reviewed base-plus-offset references. These make an operand such asmathprintArenaState + 0x0Drender as a structure member without inventing a second global name for the field address.
tools/symbols/ty_regions.txt applies the C layouts built by BuildTypes.java. The prose can therefore use expressions such as table_value_cache.band[1].value[row] once it introduces the typed base and its concrete address. A physical boundary, trace target, or byte-level proof still keeps its concrete address. [confirmed]
Math notation
Formulas are written in LaTeX and rendered by KaTeX (offline, client-side): $…$ for inline math and $$…$$ for display. Algorithms render as pseudocode blocks and data/control-flow diagrams as Mermaid.
Evidence and reproducibility
- The Ghidra database is rebuilt from the ROM by
tools/build.sh(a 15-stage reproducible pipeline around Ghidra’s headless analyzer). It loads all 64 flash pages (page 0 + overlays at4000), then resolves routines, applies function and data symbols, and installs the checked C layouts and offset references. - Local ROM trust boundary.
tools/ti84re/rom/assemble_local_rom.py --checkvalidates the exact ignored base-ROM and AppVar hashes without writing output. Its reusabletools/ti84re/rom/assembly.pylibrary decodes each TI variable container, verifies its checksum, type, name, flags, duplicate length fields, internal 16 KiB size, and payload hash, then requires the assembled-ROM hash. This proves which bytes the analysis uses; it does not prove that the files were captured from a physical calculator. The pinned base already contains theD84PBE1.8Xvpage-3Fpayload byte for byte. OnlyD84PBE2.8Xv, installed at page2F, changes the base image (8,615 bytes). [confirmed] - bcall table resolution. The main jump table page was found by scoring all 64 flash pages: for each candidate, count how many of the known bcall IDs produce a valid
(addr, page)entry. Page 0x3B scored highest for the0x4xxxtable — more known bcall IDs resolve to a valid(addr, page)entry there than on any other page — and is confirmed by the documented RST shortcuts (all six matched) and by every entry resolving and live-confirming once 0x3B is applied.0x8xxxbcall IDs index 87 populated retail boot-table entries on page3F; several USB entries target page2F. The localrom.binis assembled from the patched base plus the retailD84PBE1.8XvandD84PBE2.8Xvpayloads.tools/symbols/bcalls8x_targets.txtcontains the 83 byte-resolved bodies with public SDK names; the remaining four entries have project-inferred names. The resolver rejects these targets when page3Fhas a BootFree prefix. - Decompiler caveats. Ghidra’s Z80 decompiler can mis-render
SET b,(IY+d)flag operations,CALL cross_page_jump(ram:2B09) trampolines, and register-passed arguments on banked pages. Raw disassembly and ROM bytes are authoritative for these cases.
See the repository README.md for the exact build pipeline and tooling.