小精靈II代

台湾でコピーして売られていたグレムリン2のカートリッジです. 先日台湾に行きまして、譲っていただきました.

基板概要

  • Program ROM 128kbit x8
  • Character ROM 128kbit x8 x2
  • Memory Controller IC (DIP40, 無刻印)
  • 汎用 Logic IC
    • 74LS74, 74LS191 x2, 74LS138, 74LS139, 74LS10, 74LS393

この基板にバイパスコンデンサがまったく載っていません.

簡単に調査したところ, 無刻印の大きいICは VRC2 相当品でピン配置は独自の物でした. 汎用 Logic IC 群は VRC4 で追加されたタイマ割り込みを真似ようとしたようです.

ソフトウェア仕様

概ね, VRC4e (Tiny Toon Adventures (1作目))と同じです. VRC2 を無理矢理 VRC4 相当としようとしていたのか、調査が不完全なのかタイマ割り込み周辺は仕様が謎です.

本物のグレムリン2は Memory Controller IC に FME-7 を利用していますが、無理矢理 VRC4e 相当品で動くように ROM data にパッチをあてています. *1

VRC4e 用の scirpt で ROM data は dump できます. data だけが dump できるだけでエミュレーションが出来るかは別です.

data 差分

日本版のグレムリン2からの差分です.
日本版正規品:

コピー品:

FE00 からに追加された命令. 元の処理をつぶして jsr で飛ばす方式. タイマ割り込み周りは埋め込んで処理しているようだ.

FME-7のregister対応処理分岐

FE00: pha
FE01: lda $01a0
FE04: stx $01a0
FE07: beq $fe20
FE09: tax
FE0A: dex
FE0B: beq $fe30
FE0D: dex
FE0E: beq $fe40
FE10: dex
FE11: beq $fe50
FE13: jmp $fe67

FE67: dex
FE68: beq $fe80
FE6A: dex
FE6B: beq $fe90
FE6D: dex
FE6E: beq $fea0
FE70: dex
FE71: beq $feb0
FE73: dex
FE74: dex
FE75: beq $fec0
FE77: dex
FE78: beq $fed0
FE7A: dex
FE7B: dex
FE7C: beq $fec5
FE7E: pla
FE7F: rts

PPU memory bank control

FE20: pla       |FE40: pla       |FE80: pla       |FEA0: pla
FE21: tax       |FE41: tax       |FE81: tax       |FEA1: tax
FE22: and #$0f  |FE42: and #$0f  |FE82: and #$0f  |FEA2: and #$0f
FE24: sta $b000 |FE44: sta $c000 |FE84: sta $d000 |FEA4: sta $e000
FE27: txa       |FE47: txa       |FE87: txa       |FEA7: txa
FE28: lsr a     |FE48: lsr a     |FE88: lsr a     |FEA8: lsr a
FE29: lsr a     |FE49: lsr a     |FE89: lsr a     |FEA9: lsr a
FE2A: lsr a     |FE4A: lsr a     |FE8A: lsr a     |FEAA: lsr a
FE2B: lsr a     |FE4B: lsr a     |FE8B: lsr a     |FEAB: lsr a
FE2C: sta $b004 |FE4C: sta $c004 |FE8C: sta $d004 |FEAC: sta $e004
FE2F: rts       |FE4F: rts       |FE8F: rts       |FEAF: rts
FE30: pla       |FE50: pla       |FE90: pla       |FEB0: pla
FE31: tax       |FE51: tax       |FE91: tax       |FEB1: tax
FE32: and #$0f  |FE52: and #$0f  |FE92: and #$0f  |FEB2: and #$0f
FE34: sta $b008 |FE54: sta $c008 |FE94: sta $d008 |FEB4: sta $e008
FE37: txa       |FE57: txa       |FE97: txa       |FEB7: txa
FE38: lsr a     |FE58: lsr a     |FE98: lsr a     |FEB8: lsr a
FE39: lsr a     |FE59: lsr a     |FE99: lsr a     |FEB9: lsr a
FE3A: lsr a     |FE5A: lsr a     |FE9A: lsr a     |FEBA: lsr a
FE3B: lsr a     |FE5B: lsr a     |FE9B: lsr a     |FEBB: lsr a
FE3C: sta $b00c |FE5C: sta $c00c |FE9C: sta $d00c |FEBC: sta $e00c
FE3F: rts       |FE5F: rts       |FE9F: rts       |FEBF: rts

CPU memory bank control (CPU A8 は特に意味はないらしい)

FEC0: pla       |FEC5: pla       |FED0: pla
FEC1: sta $8100 |FEC6: sta $9100 |FED1: sta $a100
FEC4: rts       |FEC9: rts       |FED4: rts

不明

FED8: pha
FED9: jmp $fee2

FEE1: txa
FEE2: jsr $fe00
FEE5: ldx $01a0
FEE8: pla
FEE9: rts

FEF0: pha
FEF1: tya
FEF2: jsr $fe00
FEF5: ldx $01a0
FEF8: pla
FEF9: rts
FF00: nop
FF01: nop
FF02: nop
FF03: nop
FF04: nop
FF05: nop
FF06: nop
FF07: nop
FF08: nop
FF09: nop
FF0A: nop
FF0B: jmp $e42a

emulation

ちゃんと動きません. 理由は2つです.

  • この基板の VRC4 のタイマと仕様が異なるので詳細な調査が必要
  • VRC2, VRC4 は過去の混乱が原因でエミュレーションの管理が iNES header では実質無理

ほとんどのエミュレータで挙動が違うのですが FCEUX では画面がでました.

タイマ周りの雑な配線調査

調べると VRC4 とかなり違ってきたので飽きてしまいました.IC ごとに雑な考察を述べます.

  • 7474: CPU address $f008 の IRQ control 相当の register
  • 74138: CPU address $f000, $f008 の write strobe 生成
    • C 入力は 7410 の 12pin, Y2# 出力は 7474 につながってると思う
  • 74191: 何かのカウンタでつっこみどころが多い
    • 74191 は 74161 から increment/decrement (U/D) 選択, CLOCK ENABLE (G) を追加したぐらいの IC で, incmrent 固定, CLOCK ENABLE を 7474 経由で制御
    • VRC4 では counter 初期値は CPU address $f000, $f004 で 4 bit ごとに分けて書くが, この基板では $f000 に 8bit まとめて書くように変更されている.
    • CLOCK の入力線が CPU A12, CPU A13, CPU A14 の NAND であり、 A15 が含まれていないので、 $7xxx か $fxxx の検出.
    • CLOCK 入力は counter 有効時は φ2 counter とすべきだが、 $7xxx, $fxxx の address を increment 条件に含めているのはかなりの謎でちゃんと動かない
  • 7410: 1 gate は address decoder, あとは未調査
  • 74139: 調査でタイマ周りには関係してないみたいなので 2つの Character ROM を分割する decode に使ってると思う
  • 74393: 未調査で不明

*1:なお公式の NES 向けのグレムリン2は MMC3 (TLROM) で動くように変更されています