Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Memory map

The Z80 sees a flat 64 KiB logical space divided into four 16 KiB windows. Port 0x04 selects paired or independent mapping; ports 0x050x07 and their extensions select the physical Flash or RAM pages. See Paging for the complete mapper and RAM pages for RAM page 83 and restore rules.

Logical address space (what the Z80 sees)

RangeSlotContentsNotes
0000-3FFFWindow 0Flash page 0 (fixed)Boot/kernel: RST vectors, dispatcher, FP/VAT core. Never swapped. [confirmed]
4000-7FFFWindow APort 0x06 in independent mode; even half of the port-0x06 pair in paired modePaged bcall targets run here after the dispatcher maps their page. [confirmed]
8000-BFFFWindow BPort 0x07 in independent mode; odd half of the port-0x06 pair in paired modeNormally RAM page 81; boot executes page 3F here in paired mode. [confirmed]
C000-FFFFWindow CPort 0x05 RAM in independent mode; port 0x07 in paired modeNormally RAM page 80; the stack lives near the top. [confirmed]

In this OS the system RAM variables all live at 8000+, so the static RE model treats 8000-FFFF as one RAM block (see tools/ghidra/BuildTI84Full.java).

Flash layout (physical, 1 MiB = 64 × 16 KiB pages)

Page(s)RoleEvidence
00Boot/kernel core, mapped at 0000RST vectors, bcall_dispatcher, FP/VAT/mem routines [confirmed]
01OS routines (display, homescreen text, menus)_PutC,_PutS,_ClrLCDFull,_NewLine resolve here [confirmed]
06OS routines (key input, parser-ish)_GetKey06:491E [confirmed]
2FUSB boot support pagevalidated local D84PBE2.8Xv supplies this page; retail page 3F maps _AttemptUSBOSReceive2F:4145, _ReceiveOS_USB2F:48CA, _InitUSB2F:52A4, _KillUSB2F:5961 [confirmed]
3Bbcall jump tablehighest-scoring page for the 0x4xxx bcall ID table; first entry _JErrorNo00:2799 [confirmed]
3CLink code, archive GC, and OS version string ("2.55MP")page starts 32 2E 35 35 4D 50; collector entry 3C:7733 [confirmed]
3ETwo 8 KiB certificate sectors; the inactive half also carries the transactional GC journal_GetCertificateStart (8057) and the GC command trace [confirmed]
3FRetail boot pagethe patched base and validated local D84PBE1.8Xv contain the same page byte for byte; it starts 3E 07 D3 04 3E 7F D3 06 3E 03 D3 0E C3 2C 81, contains boot version string 1.03, and hosts the 0x8xxx boot bcall table [confirmed]

Pages 01-3F are loaded in Ghidra as overlays page_01 … page_3F (each at 4000). Goto e.g. 01:5b4c for _PutC.

The assembled tools/rom.bin is the Ghidra build input. tools/ti84re/rom/assemble_local_rom.py starts with ti84plus_patched.rom, validates the complete TI AppVar containers, installs D84PBE2.8Xv as page 2F, and installs D84PBE1.8Xv as page 3F. The first installation changes 8,615 bytes; the second changes none because the base already has that exact page. The required SHA-256 identities are 90472848b5f56902287fd5d8b455e62d60e9ab054647c9a03c1c91a67fc1a95a for the base and 7d9a7d96d89fc552ebee6afdbdd011fdc6047be9c16d308245dff07eb1f7bd6d for the result. These checks establish reproducible analysis inputs, not a physical-capture history. The page-2F and page-3F bodies above decode directly from rom.bin. The resolver detects a BootFree input and omits retail targets when the retail pages are absent.

Key named and typed RAM regions

AddrNameTypePurpose
0x8478-0x84B9OP1OP6TIFloat slot (9B body + 2B …EXT guard, 11B-spaced)Floating-point accumulators [confirmed]
0x89F0flagsSystemFlags (74B)IY-indexed system flag bitfield [confirmed]
0x844B/0x844CcurRow/curColbyteHomescreen text cursor (16 cols) [confirmed]
0x8447contrastbyteLCD contrast [confirmed]
0x843F0x8446kbdScanCode through keyExtend8 bytesscan mailbox, release filter, repeat state, and cooked-key workspace; see Keypad and ON-key hardware [confirmed]
0x84480x844AapdSubTimer/apdTimer/curTime3 bytesAPD low/high countdown and cursor timer [confirmed]
0x82590x82A1MD5 state73 bytes, with gapsworking words, bit length, compact length prefix, and digest; see MD5 accelerator and boot API [confirmed]
0x83A50x83E4MD5Buffer64 bytespartial message block or transformed-hash output [confirmed]
0x9C0C0x9C12timer API state7 bytesprogrammable timer-1 state, durations, and expiry count [confirmed]
0x9340plotSScreenbyte[768]Graph/display buffer (96×64/8) [confirmed]
0x86ECsaveSScreenbyte[768]Saved screen buffer [confirmed]
0x9824FPSFloating-point stack pointer [standard]
0x85BConSPSP saved by ON-interrupt [confirmed]

IY is held at flags (0x89F0) almost everywhere, so (IY+off) accesses index SystemFlags fields (appFlags, kbdFlags, …).

Principal input/output ports [standard]

A curated selection of the ports most relevant to the memory map and paging; the kernel touches many more (timer/crystal, USB-assist, and ASIC-control ports).

PortNamePurpose
00linkActive-high pull-low controls on write and physical high-line levels on read; see Two-wire link port hardware
01keypadActive-low matrix group select/read; see Keypad and ON-key hardware
02hwStatusBattery comparator, LCD-ready, Flash-lock, and family status; see ASIC status, identity, protection, and GPIO
03intMaskLegacy interrupt enable/acknowledgement and low-power-on-HALT control; see Interrupts (IM1)
04intStatus / memMapModeRead = legacy pending state, ON level, and programmable completion; write = mapping mode, standard-timer rate, and battery selector; see Interrupts (IM1)
05mapBankCRAM selector for window C in independent mode
06mapBankAFlash/RAM selector for window A in independent mode or the A/B pair in paired mode
07mapBankBFlash/RAM selector for window B in independent mode or window C in paired mode
080Dusb/link assist84+ hardware byte-assist control/status/data/FIFO ports; see USB ASIC and link assist
0E/0FmapBankAHigh/mapBankBHighHigh two Flash-page bits for ports 0x06/0x07; no page effect on this 64-page TI-84 Plus
10/11lcdCmd/lcdDataLCD controller
181FMD5 assistSix serial operand registers, rotate/mode control, and four result bytes; see MD5 accelerator and boot API
20cpuSpeed0=6 MHz, 1=15 MHz (set in ISR)
15asicIdentityPublic ASIC/RAM/USB revision value; this ROM has no immediate or statically resolved literal-C access; see ASIC status, identity, protection, and GPIO
21flashGroup/ramExecProtected writable Flash grouping and RAM-execution mode; the boot writes zero at 3F:41DC, and the kernel reads the low bits for model-specific page bounds; see ASIC status, identity, protection, and GPIO
2226execution boundsProtected Flash-page and RAM-chunk bounds; see Execution protection
27/28forced RAM overlays64-byte-granularity page-80/81 subranges; OS 2.55MP writes only zero, and paired-mode hardware behavior remains open
2DcrystalControlQuartz and programmable-timer behavior in low power
292CspeedDelaySpeed-selected LCD instruction delays and Flash/RAM wait-state gates; see Bus timing and wait states
2EmemoryDelayPer-access Flash/RAM one-T-state additions; see Bus timing and wait states
2FlcdTimerAdjustLCD-ready timing and programmable mode-3 prescaler; see Bus timing and wait states
3038programmable timersThree source/mode/counter triplets; see Clock, timers, and power
39/3AgpioConfig/gpioDataBattery-comparison and USB GPIO configuration/data; exact electrical signals remain open; see ASIC status, identity, protection, and GPIO
4048RTCControl, staged set value, and current 32-bit seconds count
4DusbLineStateUSB line-state gate sampled by _GetVarCmdUSB (id 50FB; Ghidra alias link_xfer_op); bits 5/6 gate the ram:2E0B bjump to 35:4280
55/56usbIntStatus/usbLineEventsUSB interrupt state / line events (84+) — polled before the separate legacy controller; both read-only (port 0x56 is an event bitmap, not a write mask)