84PCE:OS:Serial Flash Commands
CE calculators in hardware revision M and later (which corresponds to the Python Edition for the 83PCE) contain a new serial flash chip with an entirely new interface. For pre-Python calculators see the old parallel interface.
For reference, pages are 256 bytes, sectors are 4KB, and blocks are 64KB.
Datasheet for the W25Q32JV is here.
Basic Flash Commands
You write a command to the range $E00800-$E0080F and then wait until $E00824 bit 0 is set at which point you acknowledge by setting the same bit.
00000000 00000001 00000000 02000006 XXXXXXXX 03000001 00000000 020000D8 00000000 00000001 00000000 04000005
X is the address of the block to erase.
Writes can only happen within a single page at a time.
00000000 00000001 00000000 02000006 XXXXXXXX 03000001 YYYYYYYY 42000032
X is the address to write to.
Y is the number of bytes to write, at most the number of bytes remaining in the page.
Afterwards, write each byte to $E00900, followed by a normal wait.
Read Status Register
00000000 00000001 01000000 000000XX
X is $05 for register 1, $35 for register 2, or $15 for register 3.
Afterwards, wait for $E00818 bit 1 to be set and read register value from $E00900.
Read Unique ID
00000000 00000401 08000000 0000004B
Afterwards, wait for $E00818 bit 1 to be set and read id from $E00900 8 times.
Read Device ID
00000000 03000411 02000000 8000B094
Afterwards, wait for $E00818 bit 1 to be set and read id from $E00900 2 times, which should read $EF $15.