mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-27 03:31:49 +01:00
329 lines
10 KiB
Plaintext
329 lines
10 KiB
Plaintext
Here are some notes about EEPROM emulation, which is used in a few Sega Genesis Cartridge as external Backup RAM.
|
|
|
|
The protocol used to communicate (read/write) with serial EEPROM is explained below:
|
|
|
|
|
|
1/ from 68000 cpu (MASTER), which is running the ROM program, each EEPROM can be managed using only two single lines:
|
|
- /SDA is the DATA line, used to send/receive data (READ/WRITE)
|
|
- /SCL is the CLOCK line used to synchronize the EEPROM cycles (WRITE ONLY)
|
|
|
|
|
|
2/ each line is mapped in the 68000 address space at a specific address as one specific bit (see game mappers below)
|
|
and can be set at LOW (bit=0) or HIGH (bit=1) state.
|
|
|
|
|
|
3/ each READ/WRITE operation must be initiated with a START condition and terminated by a STOP condition:
|
|
- START condition is set when /SDA is changed from HIGH to LOW while /SCL remaining HIGH
|
|
- STOP condition is set when /SDA is changed from LOW to HIGH while /SCL remaining HIGH
|
|
|
|
|
|
4/ Following the START condition, the Master send one or more 8-bit word through the /SDA line to specify the address
|
|
that must be read or write.
|
|
Each bit write requires one clock cycle, managed by changing /SCL line state.
|
|
There are 3 known EEPROM Modes, each one using different addressing protocol:
|
|
|
|
- Mode 1 EEPROMs (24C01 only) have a maximal size of 128bytes (7bits address) and need only one address word.
|
|
The 7 first bits specify the memory address to be read/write and the 8th bit indicates if the operation type (READ or WRITE)
|
|
|
|
- Mode 2 EEPROMs (24C01 to 24C16) can be linked together (8 slave devices max.), that means in fact one 24C16, two 24C08, four 24C04,
|
|
or eight 24C02/24C01, for a maximal size of 2 Kbytes (11bits address max.).
|
|
A first word is needed: the first 4 bits are fixed and, depending on the EEPROM size, the next 3bits specify the device address
|
|
and eventually the one (24C04), two (24C08) or three (24C16) upper bits of the memory address to be read/write.
|
|
As before, the 8th bit specifies the type of the operation (READ or WRITE)
|
|
Then a second word is needed to specify the eight lower bits of the address to be read/write.
|
|
|
|
- Mode 3 EEPROMS (24C32 and more) work quite the Type 2 EEPROMS excepted that the maximal address size is 64 Kbytes (16bits address max.)
|
|
The first word is like in the previous type, bits d3-d1 always specifying the slave device address (8 linked devices max.)
|
|
The second word specifies the upper bits of the address to be read/write.
|
|
A third word specifies the eight lower bits of the address to be read/write.
|
|
|
|
NOTE: In Mode2 and Mode3, before a READ operation, only the SLAVE ADDRESS WORD will be sent, the EEPROM contains an address counter
|
|
that maintains the address of the last word to be accessed (from a previous READ or WRITE operation)
|
|
|
|
|
|
5/ Each time a 8bits word has been written (which requires eight clock cycles), the receiver (could be EEPROM or MASTER) send an acknowledge
|
|
to the sender by setting /SDA line LOW during the 9th cycle (ACK cycle).
|
|
|
|
|
|
6/ After a WRITE SEQUENCE has been initiated, the MASTER will sent DATA as one or more sequences of 8bits words.
|
|
After each written word, the EEPROM must send a ACK and increment the address for the next data word to be written.
|
|
Word address will roll up to base address when maximal writepage size has been reached.
|
|
If the Master send a STOP condition, the WRITE operation ends.
|
|
Otherwise the WRITE operation continues to next address.
|
|
|
|
|
|
7/ After a READ SEQUENCE has been initiated, the MASTER will read DATA as one or more sequence of 8bits words.
|
|
After each received word, the MASTER will send a ACK and the EEPROM will increment the address of the next data word to be read.
|
|
Word address will roll up to 0 when maximal memory size has been reached.
|
|
If the Master does not send a ACK during the 9th cycle, the READ operation ends and the EEPROM waits for STOP condition.
|
|
Otherwise, the READ operation continue to next address.
|
|
|
|
|
|
This is pretty how I emulate EEPROM access in Genesis Plus (see eeprom.c for technical details).
|
|
Thanks a lot to 8bitWizard from Spriteminds.net forums which initially give indications about the various EEPROM types and mappers
|
|
that can be found in Sega Genesis games.
|
|
|
|
Here are some links to datasheets with should explain everything better than me and my crappy english ;)
|
|
|
|
MODE1 (24C01 only):
|
|
http://www.icmic.com/datasheets/X24C01.pdf
|
|
|
|
MODE2 (24C01 - 24C16):
|
|
http://www.atmel.com/dyn/resources/prod_documents/doc0180.pdf
|
|
|
|
MODE3 (24C32 and more):
|
|
http://www.phys.hawaii.edu/~bryce/component_data/24LC65-ISM.pdf
|
|
|
|
|
|
Below are the Sega Genesis games that I found using serial EEPROM as external Backup RAM.
|
|
I also give their specific caracteristics (mapper, size, ...), determined when testing my emulation code.
|
|
|
|
|
|
|
|
EkeEke
|
|
July 2007
|
|
|
|
|
|
|
|
|
|
-------------------------------------------------------
|
|
ACCLAIM (81)
|
|
-------------------------------------------------------
|
|
|
|
NBA Jam (UE)
|
|
NBA Jam (J)
|
|
------------
|
|
T-081326
|
|
T-81033
|
|
header OK ($200001-$200001)
|
|
|
|
TYPE: 8BITS WORD ADDRESS
|
|
SIZE_MASK: 0xFF (24C02)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200000 (bit 0)
|
|
SDA_OUT: 0x200000 (bit 1)
|
|
SCL : 0x200000 (bit 1)
|
|
|
|
NB: this game uses a different EEPROM mapper than any other Acclaim games.
|
|
|
|
|
|
Blockbuster World Video Game Championship II (U)
|
|
NBA Jam Tournament Edition (JUE)
|
|
------------------------------------------------
|
|
T-81406
|
|
header KO
|
|
|
|
TYPE: TYPE: 8BITS WORD ADDRESS
|
|
SIZE_MASK: 0xFF (24C02)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200000 (bit 0)
|
|
|
|
NB: Rev 00 of the game has buggy eeprom support and game backup does not seem to work fine, only Rev01
|
|
version will correctly save game data.
|
|
For history, Steve Snake, the author of Kega, one of the best Genesis emulator for Win32 platforms, is
|
|
the one who originally developped this game.
|
|
I assume that he released himself later some kind of patch to fix the backup support.
|
|
(from the header informations, rev01 has been released in 2002, eight years after rev00 !)
|
|
|
|
NFL Quarterback Club (JUE)
|
|
-----------------------------
|
|
T-081276
|
|
header OK ($200000-$200001)
|
|
|
|
TYPE: TYPE: 8BITS WORD ADDRESS
|
|
SIZE_MASK: 0xFF (24C02)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200000 (bit 0)
|
|
|
|
|
|
NFL Quarterback Club 96 (UE)
|
|
-----------------------------
|
|
T-081586
|
|
header OK ($200000-$200001)
|
|
|
|
TYPE: TYPE: 8BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7FF (24C16)
|
|
PAGE_MASK: 0x07
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200000 (bit 0)
|
|
|
|
|
|
College Slam (U)
|
|
----------------
|
|
T-81576
|
|
header OK ($200001-$200001)
|
|
|
|
TYPE: 16BITS WORD ADDRESS
|
|
SIZE_MASK: 0x1FFF (24C64)
|
|
PAGE_MASK: 0x07
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200000 (bit 0)
|
|
|
|
|
|
Frank Thomas Big Hurt Baseball (UE)
|
|
----------------
|
|
T-81476
|
|
header OK ($200000-$200001)
|
|
|
|
TYPE: 16BITS WORD ADDRESS
|
|
SIZE_MASK: 0x1FFF (24C64)
|
|
PAGE_MASK: 0x07
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200000 (bit 0)
|
|
|
|
|
|
|
|
-------------------------------------------------------
|
|
CAPCOM (12)
|
|
-------------------------------------------------------
|
|
|
|
Megaman - The Wily Wars (E)
|
|
Rockman Mega World (J) [alt]
|
|
----------------
|
|
T-12046
|
|
T-12053 (checksum = 0xEA80)
|
|
header OK ($200001-$200001)
|
|
|
|
TYPE: 7BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7F (24C01)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200001 (bit 1)
|
|
|
|
NOTE: the original version of Rockman Mega World (J) uses traditional SRAM, header gives $200000-$203FFF range
|
|
the alternate version uses a 128bytes serial EEPROM (X24C01)
|
|
the two versions share the same GAME NAME and PRODUCT ID
|
|
|
|
|
|
|
|
-------------------------------------------------------
|
|
Electronic Arts (50)
|
|
-------------------------------------------------------
|
|
|
|
NHLPA Hockey 93 (UE)
|
|
----------------
|
|
T-50396
|
|
header KO
|
|
|
|
TYPE: 7BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7F (24C01)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200000 (bit 7)
|
|
SDA_OUT: 0x200000 (bit 7)
|
|
SCL : 0x200000 (bit 6)
|
|
|
|
|
|
Rings of Power (UE)
|
|
----------------
|
|
T-50176
|
|
header KO
|
|
|
|
TYPE: 7BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7F (24C01)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200000 (bit 7)
|
|
SDA_OUT: 0x200000 (bit 7)
|
|
SCL : 0x200000 (bit 6)
|
|
|
|
|
|
|
|
-------------------------------------------------------
|
|
SEGA
|
|
-------------------------------------------------------
|
|
|
|
Evander 'Real Deal' Holyfield's Boxing (JUE)
|
|
----------------------------------
|
|
MK-1215
|
|
header OK ($200001-$200001)
|
|
|
|
TYPE: 7BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7F (24C01)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200001 (bit 1)
|
|
|
|
|
|
Greatest Heavyweights of the Ring (U)
|
|
Greatest Heavyweights of the Ring (J)
|
|
Greatest Heavyweights of the Ring (E)
|
|
-----------------------------
|
|
MK-1228
|
|
G-5538
|
|
PR-1993
|
|
header OK ($200001-$200001)
|
|
|
|
TYPE: 7BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7F (24C01)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200001 (bit 1)
|
|
|
|
|
|
Wonder Boy in Monster World (UE)
|
|
Wonder Boy V - Monster World III (J)
|
|
----------------
|
|
G-4060
|
|
header OK ($200001-$200001)
|
|
|
|
TYPE: 7BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7F (24C01)
|
|
PAGE_MASK: 0x03
|
|
SDA_IN : 0x200001 (bit 0)
|
|
SDA_OUT: 0x200001 (bit 0)
|
|
SCL : 0x200001 (bit 1)
|
|
|
|
|
|
|
|
-------------------------------------------------------
|
|
CODEMASTERS
|
|
-------------------------------------------------------
|
|
|
|
Micro Machines 2 - Turbo Tournament (E) (J-Cart)
|
|
------------------------------------------------
|
|
T-120096-50
|
|
header KO
|
|
|
|
TYPE: TYPE: 8BITS WORD ADDRESS
|
|
SIZE_MASK: 0x3FF (24C08)
|
|
PAGE_MASK: 0x0F
|
|
SDA_IN : 0x300000 (bit 0)
|
|
SDA_OUT: 0x380001 (bit 7)
|
|
SCL : 0x300000 (bit 1)
|
|
|
|
NB: this game needs the external RAM to be initialized with 0xFF otherwise it won't initialize memory with correct data.
|
|
|
|
|
|
Micro Machines Military (E) (J-Cart)
|
|
------------------------------------
|
|
00000000-00 (checksum = 0x168B or 0xCEE0)
|
|
header KO
|
|
|
|
TYPE: TYPE: 8BITS WORD ADDRESS
|
|
SIZE_MASK: 0x3FF (24C08)
|
|
PAGE_MASK: 0x0F
|
|
SDA_IN : 0x300000 (bit 0)
|
|
SDA_OUT: 0x380001 (bit 7)
|
|
SCL : 0x300000 (bit 1)
|
|
|
|
|
|
Micro Machines Turbo Tournament 96 (E) (J-Cart)
|
|
------------------------------------------------
|
|
00000000-00 (checksum = 0x165E or 0x2C41)
|
|
header KO
|
|
|
|
TYPE: TYPE: 8BITS WORD ADDRESS
|
|
SIZE_MASK: 0x7FF (24C16)
|
|
PAGE_MASK: 0xF
|
|
SDA_IN : 0x300000 (bit 0)
|
|
SDA_OUT: 0x380001 (bit 7)
|
|
SCL : 0x300000 (bit 1) |