EEPROM
The WonderSwan utilizes M93LCx6-compatible EEPROMs:
- in the SoC:
- 1 Kbit internal EEPROM (M93LC46-compatible) on the WonderSwan,
- 16 Kbit internal EEPROM (M93LC86-compatible) on the WonderSwan Color,
- on cartridges:
- 1 Kbit cartridge EEPROM (M93LC46-compatible)
- 8 Kbit cartridge EEPROM (M93LC76-compatible)
- 16 Kbit cartridge EEPROM (M93LC86-compatible)
Additional variants exists which were not seen on any production cartridge:
- 256 bit EEPROM (M93LC06-compatible)
- 2 Kbit EEPROM (M93LC56-compatible)
- 4 Kbit EEPROM (M93LC66-compatible)
Commands
READ - Read Word
The READ command takes an address of a word (address 0 => bytes 0, 1; address 1 => bytes 2, 3; ...) and returns the word at that address.
WRITE - Write Word
The WRITE command takes an address of a word (address 0 => bytes 0, 1; address 1 => bytes 2, 3; ...) and the word to write to it, then writes the word.
ERASE - Erase Word
The ERASE command takes an address of a word (address 0 => bytes 0, 1; address 1 => bytes 2, 3; ...) and erases the word at that address, setting it to 0xFFFF.
WDS - Write Disable
The WDS command prevents issued write and erase commands from having an effect on the EEPROM.
WRAL - Write All
The WRAL command erases the word at all address of the EEPROM, setting them to 0xFFFF.
This command is not guaranteed to be present on all EEPROMs.
ERAL - Erase All
The WRAL command takes a word and writes it to all addresses of the EEPROM.
This command is not guaranteed to be present on all EEPROMs.
WEN - Write Enable
The WEN command restores the effect of issued write and erase commands on the EEPROM disabled using WDS.
I/O ports
The I/O ports listed refer to the internal EEPROM; for the cartridge EEPROM port numbers, refer to the mapper documentation.
It is recommended to only access the data and command ports with aligned word reads/writes; see the Errata section for more information.
Internal EEPROM Data ($BA, $BB read)
Cartridge EEPROM Data ($C4, $C5 read)
15 bit 8 7 bit 0 ---- ---- ---- ---- dddd dddd dddd dddd |||| |||| |||| |||| ++++-++++--++++-++++- Data read from the EEPROM.
The read buffer's value changes only once the Read command is completed.
Internal EEPROM Data ($BA, $BB write)
Cartridge EEPROM Data ($C4, $C5 write)
15 bit 8 7 bit 0 ---- ---- ---- ---- dddd dddd dddd dddd |||| |||| |||| |||| ++++-++++--++++-++++- Data to write to the EEPROM.
The write buffer is latched when a Write command is initiated; further writes to it do not affect the value written by that specific command.
The two EEPROM data buffers are not shared; neither writes to the write buffer nor the execution of non-read commands affect the contents of the read buffer.
Internal EEPROM Command ($BC, $BD)
Cartridge EEPROM Command ($C6, $C7)
Command Pattern 1 15 bit 8 7 bit 0 ---- ---- ---- ---- 0000 0001 ooaa aaaa (¼, 1 Kbit - M93LC06/46) 0000 01oo aaaa aaaa (2, 4 Kbit - M93LC56/66) 0001 ooaa aaaa aaaa (8, 16 Kbit - M93LC76/86) |||| |||| |||| ||++--++++-++++- Address (MSb .. LSb) ++-------------- Opcode: 01 - WRITE 10 - READ 11 - ERASE
Command Pattern 2 15 bit 8 7 bit 0 ---- ---- ---- ---- 0000 0001 00ss .... (¼, 1 Kbit - M93LC06/46) 0000 0100 ss.. .... (2, 4 Kbit - M93LC56/66) 0001 00ss .... .... (8, 16 Kbit - M93LC76/86) |||| ||++------------ Sub-Opcode: || 00 - WDS || 01 - WRAL || 10 - ERAL || 11 - WEN ++-------------- Opcode: 00
The value written to this port can be read back; it is not affected by EEPROM Control.
Internal EEPROM Control ($BE, $BF write)
15 bit 8 7 bit 0 ---- ---- ---- ---- .... .... PSWR .... |||| |||+------ Read operation: 1 for READ command, 0 otherwise ||+------- Write operation: 1 for WRITE and WRAL command, 0 otherwise |+-------- Short operation: 1 for ERASE, WDS, ERAL and WEN command, 0 otherwise +--------- Protection: 1 to enable internal EEPROM write protection. Cannot be cleared once set.
- Read operation: Sends 16 bits from Command, then reads 16 bits to Data.
- Write operation: Sends 16 bits from Command, then 16 bits from Data. De-asserts Microwire chip select, then re-asserts it and waits for the EEPROM to confirm command completion.
- Short operation: Sends 16 bits from Command, de-asserts Microwire chip select.
- Protection: Enables internal EEPROM write protection (addresses >= 0x30, or anything after the first 96 bytes, can no longer be written to).
If more than one of the Read, Write, Short, Protect bits are set, the operation is treated as invalid (all four operation bits are cleared and no communication is done with the EEPROM). Notably, this means that writing, for example, 0x90 does not protect the internal EEPROM if it wasn't already protected, but writing 0x80 does.
The command requested here should match the command sent to the EEPROM in port $BC.
Cartridge EEPROM Control ($C8, $C9 write)
15 bit 8 7 bit 0 ---- ---- ---- ---- .... .... ASWR .... |||| |||+------ Read operation: 1 for READ command, 0 otherwise ||+------- Write operation: 1 for WRITE and WRAL command, 0 otherwise |+-------- Short operation: 1 for ERASE, WDS, ERAL and WEN command, 0 otherwise +--------- Abort operation
- Read operation: Sends 16 bits from Command, then reads 16 bits to Data.
- Write operation: Sends 16 bits from Command, then 16 bits from Data. De-asserts Microwire chip select, then re-asserts it and waits for the EEPROM to confirm command completion.
- Short operation: Sends 16 bits from Command, de-asserts Microwire chip select.
If more than one of the Read, Write, Short bits are set, or if the Abort bit is set, the operation is treated as invalid (all four operation bits are cleared and no communication is done with the EEPROM).
Internal EEPROM Status ($BE, $BF read)
Cartridge EEPROM Status ($C8, $C9 read)
15 bit 8 7 bit 0 ---- ---- ---- ---- .... .... P... ..rd | || | |+- 0 after a Read command is initiated, | | 1 once a Read command is completed. | | Unaffected by Write/Erase commands. | +-- 0 if the EEPROM is busy, | 1 if a command can be accepted (idle). +--------- Internal EEPROM write protection: 0 = disabled, 1 = enabled
Hardware notes
EEPROM command bits are shifted out starting from the most significant bit of the port.
+----> EEPROM Serial Data | [0] <= [0000 0001 ooaa aaaa] EEPROM Command Port
While the M93LCx6 family supports byte organization, the WonderSwan always uses word organization. As such, this implementation detail is omitted in this documentation.
The SPHINX SoC family emulates a 93C46 in ASWAN compatibility mode by manipulating the shifted out command value when sending it to the EEPROM (TODO: How exactly?).
Errata
Cartridge: Buggy Done bit
On the cartridge implementation in the 2001 mapper, the EEPROM "done" bit is buggy and doesn't have useful information. It's set when a Read completes, but is only cleared when a Command or Write is started. (To be useful it would need to also be cleared when a Read is started.)
Internal: Non-word access on ASWAN
On the ASWAN SoC, accessing the internal EEPROM command ports as bytes only works correctly for even addresses. For odd addresses, these accesses return open bus; this means that unaligned word accesses also don't work, as they are converted to one odd and one even byte access internally.
It is recommended to only use aligned word port accesses to talk to the internal EEPROM.
This issue is not present on the SPHINX and newer SoCs, including in "mono" emulation mode. It is also not present on the cartridge impelmentation in the 2001 mapper.