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:
At the beginning of the game saving session:
For every byte (A0-A8, D0-D7) being saved:
When loading a game, for every byte:
- 櫻桃小丸子 (Chibi Maruko, G-005)
- 黑暗之蛊 (Dark Seed, G-009)
Code:
$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.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
At the beginning of the game saving session:
Code:
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
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:
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
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:
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?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