CNROM は 1986 年以降によく利用された基板の名称。バンク切り替えの仕組みが非常に単純で、自作ROMにも広く利用されている。
一見単純に見える仕様だが、簡単なコピープロテクトの仕組みを持ち、ファミコンでは CNROM が出始めて約1年間のわずかなソフトにコピープロテクトが使われている。
一見単純に見える仕様だが、簡単なコピープロテクトの仕組みを持ち、ファミコンでは CNROM が出始めて約1年間のわずかなソフトにコピープロテクトが使われている。
pin #27 = 74161 Q1 pin #26 = 74161 Q0 A12:A0 = PPU A12:0 D7:0 = PPU D7:0 CE# = PPU A13 OE# = PPU RD#
- pin #27, #26 は基本的に A14, A13 となるが、データ容量が32KB未満の場合は chip enable または no connection となる。
- extra chip enable が存在する場合、正論理、負論理はソフトによって異なりアドレスは全てデコードされ、 mirror は発生しない。
CLEAR = GND CLOCK = CPU ROMSEL# LOAD = CPU R/W D3:2 = CPU D5:4 D1:0 = CPU D1:0 Enable P = GND Enable T = GND
- parallel input を load する機能でデータバスをラッチする
- increment 機能は使用しない
- 任天堂製基板には LS161 と印字されているが 74HC161 が配置される
- 他社製互換基板には 74LS161 が配置されている
- Ripple Carry は NC
pad #3 = PPU A12 pad #4 = 74161 Q3
- diode は 一部のソフトで配置され、D1, D2 の方向はソフトによって異なる。
- 任天堂製基板
- 1986 年製のゲームの一部にダイオードが実装されている。
- それ以降は pad は存在するもののダイオードはない。
- バンダイ製基板
- 全てのソフトにダイオードが実装されている
[CPU - read] $8000-$ffff Program ROM [CPU - write] $8000-$ffff Program ROM (バス衝突) $8000-$ffff charcter ROM bank register bit 5:4 74161 Q3:2 (diode pad #4, #3) 1:0 74161 Q1:0 (Charcter ROM pin #27, #26)
- register へ write すると ROM からもデータ出力がされるので、データをただしくラッチするには ROM と CPU のデータ出力を同じにする必要がある。
- diode n>|m の場合は 0, n|<m, 場合は 1 を Q3:2 へラッチすると PPU A12, A10 が安定する (n:1or3, m:2or4)
- diode がない場合は bit5:4 を無視する
[PPU - read] 0x0000-0x1fff charcter ROM bank 0x2000-0x23ff system VRAM 0x000-0x3ff 0x2400-0x27ff system VRAM 0x000-0x3ff (V), 0x400-0x7ff (H) 0x2800-0x2bff system VRAM 0x400-0x7ff (V), 0x000-0x3ff (H) 0x2c00-0x2fff system VRAM 0x400-0x7ff [PPU - write] 0x2000-0x2fff PPU - read と同じ
reset 直後に bank 切り換えを行い、PPU data port ($2007) を経由して Charcter data が正しくとれるか確認を行う。bank 切り替えが正しくない場合は無限ループに入ってゲームが起動しない。
エミュレータでは charcter data < 32 KB で mapper #3 の場合には、mirror が起きるようになっているのでこのプロテクトが反映されてソフトが起動しない。このため mapper #185 を定義しているが、ソフト個別のパラメータの実装は非常に曖昧である。
charcter data == 32KB であってもソフトウェアでは確認を行っていることがある。
エミュレータでは charcter data < 32 KB で mapper #3 の場合には、mirror が起きるようになっているのでこのプロテクトが反映されてソフトが起動しない。このため mapper #185 を定義しているが、ソフト個別のパラメータの実装は非常に曖昧である。
charcter data == 32KB であってもソフトウェアでは確認を行っていることがある。
mapper #185 として定義されているゲームソフトはダイオードのパラメータを適切に設定した上で無効 page を含めて dump すると、全て mapper #3 として問題なく動作する。ROM ではない領域のデータの値(例えば 0xff)を定義するだけでよい。
最大 0x6000 byte の一見無駄なデータ領域が発生するが、15年前の PC でさえ、これくらいのデータサイズを惜しむ必要がないのに、別のマッパーを定義したのは疑問を感じる。
最大 0x6000 byte の一見無駄なデータ領域が発生するが、15年前の PC でさえ、これくらいのデータサイズを惜しむ必要がないのに、別のマッパーを定義したのは疑問を感じる。
- ハードウェア依存情報として下記の項目を追加する
- Charcter ROM の pin #27, #26 の扱い (NC, Address or chip select (negative or positive))
- D1, D2 の存在と接続方向
- charcter pin #27, #26 が Address ではない場合 (data size < 32KB) は未使用 page を bus open として 0xff で埋める。 (基本的に mirror にしてはいけない)
- D1, D2 は dump 時に解決されるべき情報であるので実装の優先度は低い。
D2D1 C27 C26 S page yyyy/mm/dd name ------------------------------------------------------ ? ? A14 A13 ? 0123 1986/04/17 ゲゲゲの鬼太郎 妖怪大魔境 > < CE# CE+ 1 z0zz 1986/04/24 マイティボンジャック < > CE+ CE# 2 zz0z 1986/04/25 けいさんゲーム1年生のさんすう < > CE+ CE# 2 zz0z 1986/04/25 けいさんゲーム2年生の算数 < > CE+ CE# 2 zz0z 1986/04/25 けいさんゲーム3年生の算数 ? ? A14 A13 ? 0123 1986/04/25 グラディウス < > CE# CE+ 2 z0zz 1986/04/25 SPY VS SPY > > A14 A13 3 0123 1986/05/27 ドラゴンクエスト * * CE+ CE+ * zzz0 1986/06/03 バードウィーク > > A14 A13 3 0123 1986/06/13 スターソルジャー > > CE+ CE+ 3 zzz0 1986/07/03 B-Wings ? ? A14 A13 0 0123 1986/08/08 六三四の剣 < < A14 A13 0 0123 1986/09/01 キングスナイト > > A14 A13 3 0123 1986/09/01 ASO > < CE+ A13 1 zz01 1986/09/08 バナナ > > A14 A13 3 0123 1986/09/22 ゴーストバスターズ < > A14 A13 2 0123 1986/09/26 スペースハンター < > A14 A13 2 0123 1986/10/01 けいさんゲーム4年生の算数 ? ? A14 A13 ? 0123 1986/10/01 けいさんゲーム5・6年生の算数 > > A14 A13 3 0123 1986/10/18 バギーポッパー ? ? A14 A13 ? 0123 1986/11/12 ファミリートレーナー アスレチックワールド > > A14 A13 3 0123 1986/11/13 迷宮組曲 < < A14 A13 0 0123 1986/11/28 キャッスルエクセレント ? ? A14 A13 ? 0123 1986/12/01 ファミリートレーナー ランニングスタジアム < < A14 A13 0 0123 1986/12/06 ホッターマンの地底探検 > > A14 A13 3 0123 1986/12/25 聖飢魔II * * NC A13 * 0101 1986/12/26 アルカノイド * * CE# A13 * 01zz 1987/03/25 いきなりミュージシャン ? ? A14 A13 ? 0123 1987/11/27 ファミリートレーナー ファミトレ大運動会 ? ? A14 A13 ? 0123 1987/12/01 ファミリートレーナー 突撃!風雲たけし城 ? ? A14 A13 ? 0123 1988/12/20 ファミリートレーナー 風雲!たけし城二 ? ? A14 A13 ? 0123 1989/01/31 ファミリートレーナー 来来キョンシーズ * * NC A13 * 0101 1990/08/10 ピーパータイム
D2
*: diode なし, <: 3=K,4=A >:3=A,4=KD1
*: diode なし, <: 1=K,2=A >:2=A,1=KC27 C26 (charcter ROM pin #27, #26)
CE+: potive chip enable, CE#: negative chip enable NC: no connectionS
register bit5:4 に書き込むと出力が安定する値, * はどれでもよいpage
register bit3:0 に書き込むと出てくる ROM page を 0,1,2,3 の順に並べたもの。z は bus open. 0123 は A14:13 が有効, 0101 は mirror, z がある場合は, 追加された Chip Enable が存在する。yyyy/mm/dd
発売日
ROM bank のレジスタは CNROM と同じだが、 voice decoder を持つ。サウンド出力に voice を合成する。voice 向けのレジスタが追加されており、 diode を3つ持つが調査は不完全である。
voice の内容は chip 内部の ROM が持つため、ソフトウェア側で複雑な制御は出来ない。nes ファイルの仕様では CPU/PPU に無関係の ROM を持つことが出来ないので完全にサポートできない。voice ROM データは IC 外部から見られないのでデータの取得には decap が必要。(燃えろプロ野球と同じ状態)
voice の内容は chip 内部の ROM が持つため、ソフトウェア側で複雑な制御は出来ない。nes ファイルの仕様では CPU/PPU に無関係の ROM を持つことが出来ないので完全にサポートできない。voice ROM データは IC 外部から見られないのでデータの取得には decap が必要。(燃えろプロ野球と同じ状態)
CPU address $6000-$7fff に RAM を追加しているので、バス衝突を回避しているものと思われる。エミュレータではデフォルトで CPU $6000-$7fff が RAM になっている関係でたまたま動いている。
CNROM が登場する前の 1985 年の時点でソフトをコピーするファミリーライターというものが存在していた。ファミリーライターは EPROM と消去のための穴を設けたカートリッジ「生カセット」でデータを書き込む装置である。これは任天堂非公認の怪しいものであった。
当時はバンク切り替えがあるカートリッジはごく一部で、大半のゲームソフトは Program ROM 32KB + Charcter ROM 8KB のデータを書き換えることで動作した。
ファミリライターの対策と Charcter ROM の容量向上を兼ねたカートリッジが CNROM と見て良いだろう。1986年4月に出たソフトは Charcter ROM のデータサイズが 8KB であるが、未使用ページへバンク切り替えを行って、未使用データがでないとゲームが起動しないようになっている。これはバンク切り替えを持たないファミリライターへの対策である。
CNROM のプロテクト機能は1987年以降には積極的に使用されていない。これはプロテクトの構造が非常に安易だったことと、Charcter ROM のデータを 32KB を使うゲームが増えたこと、ディスクシステムが流行したことなど複数の理由が関与していると思われる。
特にディスクシステムは注目されていてソフトの供給が増えており、コピーの手法がかなり早い段階で確立していたようだ。1987年のバックアップ活用テクニック(月刊誌ゲームラボの前身)では広告欄や記事本編でもディスクシステムのコピー方法が注目されている。任天堂もディスクにコピー防止策を講じているが、ROM カートリッジへのプロテクトは少ないように見える。
当時はバンク切り替えがあるカートリッジはごく一部で、大半のゲームソフトは Program ROM 32KB + Charcter ROM 8KB のデータを書き換えることで動作した。
ファミリライターの対策と Charcter ROM の容量向上を兼ねたカートリッジが CNROM と見て良いだろう。1986年4月に出たソフトは Charcter ROM のデータサイズが 8KB であるが、未使用ページへバンク切り替えを行って、未使用データがでないとゲームが起動しないようになっている。これはバンク切り替えを持たないファミリライターへの対策である。
CNROM のプロテクト機能は1987年以降には積極的に使用されていない。これはプロテクトの構造が非常に安易だったことと、Charcter ROM のデータを 32KB を使うゲームが増えたこと、ディスクシステムが流行したことなど複数の理由が関与していると思われる。
特にディスクシステムは注目されていてソフトの供給が増えており、コピーの手法がかなり早い段階で確立していたようだ。1987年のバックアップ活用テクニック(月刊誌ゲームラボの前身)では広告欄や記事本編でもディスクシステムのコピー方法が注目されている。任天堂もディスクにコピー防止策を講じているが、ROM カートリッジへのプロテクトは少ないように見える。
- NesDevWiki http://wiki.nesdev.com/w/index.php/CNROM
- NesCartDB http://bootgod.dyndns.org:7777/search.php?region_o...
- 外道猫氏