M164: Serial EPROM, I²C-like but not I²C?

Discuss hardware-related topics, such as development cartridges, CopyNES, PowerPak, EPROMs, or whatever.

Moderator: Moderators

Post Reply
NewRisingSun
Posts: 1510
Joined: Thu May 19, 2005 11:30 am

M164: Serial EPROM, I²C-like but not I²C?

Post by NewRisingSun »

A few of the games from Union Bond/Mars Productions seem to use a serial EPROM instead of the normal 8 KiB of WRAM at $6000-$7FFF:
  • 櫻桃小丸子 (Chibi Maruko, G-005)
  • 黑暗之蛊 (Dark Seed, G-009)
Using mapper 164 (more on other aspects of mappers 162-164 at a later time), I identify the following bit functions:

Code: Select all

$5200 write:
 D~7654 3210
   ---------
    ..| .||+- DAT
      |  |+-- Inner 32 KiB bank number in mode 4
      |  +--- CLK
      +------ EN 1=Enable serial bus?
	      
$5500 read:
 D~7654 3210
   ---------
    ... .|..
         +--- Data from serial bus
I am somewhat puzzled by the actual data being transferred. Either I am misunderstanding I²C, or the protocol is only I²C-like but not real I²C.

At the beginning of the game saving session:

Code: Select all

EN: 0  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; cmd D2
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; cmd D1
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; cmd D0. cmd=100: clear? init?
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A8?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A7?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A6?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A5?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A4?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A3?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A2?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A1?
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; A0?
EN: 1  CLK: 0  DAT: 1

EN: 0  CLK: 0  DAT: 1
For every byte (A0-A8, D0-D7) being saved:

Code: Select all

EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; cmd D2
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; cmd D1
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; cmd D0. cmd 101=write
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A8
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A7
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A6
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A5
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A4
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A3
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A2
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A1
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A0
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D7
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D6
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D5
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D4
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D3
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D2
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D1
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; D0
EN: 1  CLK: 0  DAT: 0

EN: 0  CLK: 0  DAT: 0
EN: 1  CLK: 0  DAT: 0
; wait for RDY
EN: 0  CLK: 0  DAT: 0
When loading a game, for every byte:

Code: Select all

EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; cmd D2
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 1
EN: 1  CLK: 1  DAT: 1	; cmd D1
EN: 1  CLK: 0  DAT: 1

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; cmd D0. cmd 110=read
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A8
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A7
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A6
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A5
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A4
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A3
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A2
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A1
EN: 1  CLK: 0  DAT: 0

EN: 1  CLK: 0  DAT: 0
EN: 1  CLK: 1  DAT: 0	; A0
EN: 1  CLK: 0  DAT: 0

Eight times:
EN: 1  CLK: 1  DAT: 0
EN: 1  CLK: 0  DAT: 0
; Read bit
Any idea what particular device this might be?
lidnariq
Posts: 11430
Joined: Sun Apr 13, 2008 11:12 am

Re: M164: Serial EPROM, I²C-like but not I²C?

Post by lidnariq »

With 9 bits of address, that looks like a 93c66.
NewRisingSun
Posts: 1510
Joined: Thu May 19, 2005 11:30 am

Re: M164: Serial EPROM, I²C-like but not I²C?

Post by NewRisingSun »

That seems to check out. Thanks!

So what I called "EN" would be the Chip Select line of the Microwire (not I²C) interface?
lidnariq
Posts: 11430
Joined: Sun Apr 13, 2008 11:12 am

Re: M164: Serial EPROM, I²C-like but not I²C?

Post by lidnariq »

Yup.
Post Reply