Nintendo Entertainment System Documentation v0.53 (japanese)
+------------------------------------------------------+ | Nintendo Entertainment System Documentation v0.53 |
| by Y0SHi (yoshi@parodius.com) |
| |
| http://nesdev.parodius.com/ |
+------------------------------------------------------+
+---+------------------+
| 0 | Introduction |
+---+------------------+
+-----------------------------+
| READ ME READ ME READ ME |
+-----------------------------+
去年を通じてのNESとコンソール以外の領域に関するすべての彼の支援と精神的支持
のために、Alex Krasivsky (IRCではLandy)にこの文書を捧げたい。 よい時も悪い
時も、Alexはそこにいた。 スパシーボ、Alex; umnyj russki
+-----------------------------+
| READ ME READ ME READ ME |
+-----------------------------+
この文書には矛盾してた説明がある。 用語に関する多くの問題と間違いがある
(VROM対CHR-RAMなど)。 完璧から*ほど遠い*。 私が組込みたいすべての用語を組込
んではいない。 時間と支援があれば、そこに着くだろう。
Marat FayzullinのNES文書と私のものの間の厳しい類似点に気づくだろう; 私の文
書は元来彼の文書に基づいている。 Maratの文書なしでは、私はこれを作成する望
みがなかっただろう。
「{xxx}を行う方法がわからない。」といった、 6502の詳細やそういった問題に関
して私に電子メールを送らないこと。 私はこのような電子メールに興味がない; そ
れが拒絶で非礼に聞こえることを知っているが、私は実際に 6502の問題に関する電
子メールを受け取ることにうんざりして飽き飽きしている。 本を読むこと。 図書
館は6502の本で*いっぱい*である。 6502に関するウェブページが何トンもある。
私は6502もいかなるアセンブリ言語(とUNIX)も教えない。 それを学習することはあ
なたの責任である。
「私はエミュレータを書いています。私は助けが必要です。 エミュレータを書く方
法について、文書かコードを送ってください。」 のような電子メールを私に送らな
いこと。 私は答えない(電子メールが削除されるだろう)。 あなたは著者である:そ
ういった作業に取り組むつもりならば、そういったもののエミュレートに取り掛か
る方法を知るために、CPUとシステムのことを十分に知っているべきである。 実際
のシステムアーキテクチャの問題と、この文書の間違いに関する、質問やコメント
に答えよう。
最後に、謝辞が予定されているところで、謝辞を与える。 セクション#15の人々は
すべて、この文書への寄与を支援した。 彼らに必ず感謝する。彼らの支援なしで
は、この文書は帯域幅を浪費する以上のものにならなかっただろう。
+---+-----------------+
| 1 | 説明 |
+---+-----------------+
NESは、カスタム6502 CPUと、グラフィックスのために使われるPPU(ピクチャ処理ユ
ニット)から成り立つ。 プログラムはレジスタ(いわばI/Oポート)によってNESとや
りとりすることができ、NESに内部的に様々なことを起こすことを可能にする。
NESの上にメモリの多数のエリアがあり、混同してはならない。 星印('*')で印のあ
る用語はこの文書で使われる用語である。
+----------+-------------------------------------------------------------+
| 用語. | 説明 |
+----------+-------------------------------------------------------------+
|* PRG-ROM | 実際のプログラムコードエリアの日本の任天堂の用語。 |
| | |
| | プログラムROMを表わす。 |
+----------+-------------------------------------------------------------+
|* CHR-RAM | PPUの内部RAMのパターンテーブルのための日本の任天堂の用語。 |
| | |
| | キャラクタRAMを表わす。 |
+----------+-------------------------------------------------------------+
|* VRAM | PPU(ピクチャ処理ユニット)の内部RAM。 |
| | 16Kの内部VRAMがある。 |
+----------+-------------------------------------------------------------+
|* WRAM | これはZelda 1と2、Crystalis、Final Fantasyシリーズと他の |
| | ゲームのように、セーブをサポートするゲーム(通常RPG)のため |
| | に最も一般に使われるメモリである。 |
| | |
| | 書き込み可能なRAMを表わす。 |
+----------+-------------------------------------------------------------+
|* MMC | 標準の6502の64K制限を越えたメモリをアドレスするためのカー |
| | トリッジ内のマイクロコントローラ。さらに拡張VRAMをアドレス |
| | するために使用でき、「特殊効果」のために使われることもある。|
| | |
| | MMCはマルチメモリコントローラを表わす。 |
+----------+-------------------------------------------------------------+
|* EXRAM | これは拡張色(属性)モードをサポートするためにMMC5の中で使わ |
| | れるメモリである。この主題についてのより詳細に関しては、 |
| | セクション#10を参照する。 |
| | |
| | 外部RAMを表わす。 |
+----------+-------------------------------------------------------------+
| VROM | パターンテーブルデータはPPU自身の外部にある; |
| | 標準のCHR-RAMデータは、MMCによってPPUに交換in/outされる。 |
| | |
| | VROMはビデオROMを表わす。 |
+----------+-------------------------------------------------------------+
| CHR | CHR-RAMの同義語。 |
+----------+-------------------------------------------------------------+
| PRG | PRG-ROMの同義語。 |
+----------+-------------------------------------------------------------+
| SRAM | WRAMの同義語。 |
+----------+-------------------------------------------------------------+
+---+--------------------+
| 2 | CPUメモリマップ |
+---+--------------------+
+---------+-------+-------------------------------------------+
|アドレス |サイズ | 説明 |
+---------+-------+-------------------------------------------+
| $0000 | $800 | RAM |
| $0800 | $800 | RAM ($0000のミラー) |
| $1000 | $800 | RAM ($0000のミラー) |
| $1800 | $800 | RAM ($0000のミラー) |
| $2000 | $3000 | レジスタ |
| $5000 | $1000 | 拡張モジュール |
| $6000 | $1000 | WRAM |
| $7000 | $1000 | WRAM または Trainer (RAM) |
| $8000 | $4000 | PRG-ROM (低位) |
| $C000 | $4000 | PRG-ROM (高位) |
+---------+-------+-------------------------------------------+
2つの分割されたPRG-ROMセクションに注意する; それらは一致するが、さらにカー
トリッジ自身のサイズに依存して分割された役割を演ずる。 いくつかのゲームは、
1つの16KのバンクのPRG-ROMだけを保持し、$8000(低位)ではなく$C000(高位)にロー
ドされる。 これを行ういくつかのゲームはBattle City, Mario Brothers,
Millipede, Nuts & Milk, Tennisである。 他のものが同様にある。
ほとんどのゲームはPRG-ROM空間を32K使用し、$8000(低位PRG-ROM)にロードされ
る。 PRG-ROM空間全体を使う最初のゲームは、(私の知識では)スーパーマリオブラ
ザーズである。 しかし、PRG-ROMの1つの16Kのバンクを越えるゲームはすべて、同
様に$8000にロードされる。 これらのゲームは、32Kの制限を越えたPRG-ROMをアド
レスし、8K以上のCHR-RAMを同時にアクセスするためにMMC(セクション#10を参照)を
使う。
+---+--------------------------------+
| 3 | PPUとスプライトメモリマップ |
+---+--------------------------------+
PPUメモリマップ
+---------+-------+-------------------------------------------+
|アドレス |サイズ | 説明 |
+---------+-------+-------------------------------------------+
| $0000 | $1000 | パターンテーブル#0 (恐らくCHR-RAM) |
| $1000 | $1000 | パターンテーブル#1 (恐らくCHR-RAM) |
| $2000 | $3C0 | ネームテーブル #0 |
| $23C0 | $40 | 属性テーブル #0 |
| $2400 | $3C0 | ネームテーブル #1 |
| $27C0 | $40 | 属性テーブル #1 |
| $2800 | $3C0 | ネームテーブル #2 (ミラーに基づく) |
| $2BC0 | $40 | 属性テーブル #2 (ミラーに基づく) |
| $2C00 | $3C0 | ネームテーブル #3 (ミラーに基づく) |
| $2FC0 | $40 | 属性テーブル #3 (ミラーに基づく) |
| $3000 | $F00 | [---EMPTY---] |
| $3F00 | $10 | イメージパレット |
| $3F10 | $10 | スプライトパレット |
| $3F20 | $E0 | [---EMPTY---] |
+---------+-------+-------------------------------------------+
スプライトRAM
+---------+-------+-------------------------------------------+
|アドレス |サイズ | 説明 |
+---------+-------+-------------------------------------------+
| $0000 | $100 | スプライトRAM |
+---------+-------+-------------------------------------------+
スプライトRAMに関してより詳細に関しては、セクション#6と#9を参照する。
上に示されるように、VRAMは全く未構成である。 私の知る限り、VRAMは14ビットの
アドレス経由でアドレスされるので、メモリ制限がメモリの終了($3FFF)を越える場
合、$0000にラップされるはずである。
2つのネームテーブルと2つの属性テーブルをサポートする、十分なVRAMメモリだけ
がある。 したがって、ネーム/属性テーブル#2と#3はネーム/属性テーブル#0と#1の
ミラーである。 どのテーブルがミラーされるかは、カートリッジヘッダの内部のミ
ラービットの設定に左右される(より詳細に関してはセクション#12を参照)。
実際のNESでは、VRAMの読み書きはVBlank中にのみ試みられるべきである。 多くの
より小さなROMにはパターンテーブル用CHR-RAMがある。 この場合、このメモリに書
き込むことができない。
VRAMへの書き込み
---------------
1) $2006に上位アドレスバイトを書き込む。
2) $2006に下位アドレスバイトを書き込む。
3) $2007にデータを書き込む。 各書き込みの後に、アドレスは自動的に1または
32($2000のビット#2が1の場合)ずつ増加する。
VRAMからの読み出し
-----------------
1) $2006に上位アドレスバイトを書き込む。
2) $2006に下位アドレスバイトを書き込む。
3) $2007からデータを読む。 $2007からの最初の読み込みは無効なので、実際のデ
ータを読む前に世話をされるべきである。
4) $2007からデータを読む。 ここから、各々読まれた後、アドレスは1または
32($2000のビット#2が1の場合)ずつ自動的に増加する。
ネームテーブルは「タイルインデックス値」を保持する。 タイル自身は8x8ピクセ
ルである。 全ネームテーブルは32x30タイル(256x240ピクセル)である。 しかし、
NTSCとPALの周波数により、実際に表示される解像度は異なる。
NTSCでは、上部と下部の16ピクセルが表示されないので、解像度は256x224である。
ネームテーブル自身は、32x30タイル(256x240ピクセル)の静的サイズを保つ。
NES PAL/NTSC問題に関してより詳細には、次のMark KnibbsのNES PAL/NTSC文書を自
由にチェックする:
http://nesdev.parodius.com/nesfreq.txt
継続する...
これらの値(「タイルインデックス値」)は、通常、$2006のレジスタへの書き込みに
よってネームテーブルの中に入れられる(セクション#6を参照)。 これらの値はパタ
ーンテーブルに格納された情報を参照するために使われる。 エミュレータ著者のた
めに、公式は全く単純である:
(VALUE * 16) + ScreenPatternTableAddress
ここでVALUEはレジスタ$2006に書かれる値であり、ScreenPatternTableAddressはレ
ジスタ$2000のビット#2(セクション#6を参照)の中に定義されたスクリーンパターン
テーブルアドレスである。
NESは、画面上に16色だけを同時に表示できる。
パターンテーブルは次の形式でタイルを含んでいる:
パターンテーブルの内容 色結果
--------------- --------
%00010000 = $10 --+ ...1.... Periods are used to rep-
%00000000 = $00 | ..2.2... resent colour 0. Numbers
%01000100 = $44 | .3...3.. shown represent colour #.
%00000000 = $00 +-- Bit 0 2.....2.
%11111110 = $FE | 1111111.
%00000000 = $00 | 2.....2.
%10000010 = $82 | 3.....3.
%00000000 = $00 --+ ........
%00000000 = $00 --+
%00101000 = $28 |
%01000100 = $44 |
%10000010 = $82 +-- Bit 1
%00000000 = $00 |
%10000010 = $82 |
%10000010 = $82 |
%00000000 = $00 --+
右上の「色結果」セクションで示されるように、上記のパターンテーブルの結果は
文字「A」である。
タイルの各ピクセルの2ビットだけがパターンテーブルに格納される。 他の2ビット
は属性テーブルから得られる。 4ビットでNESの表示可能な色全体を構築する。した
がって、NESが画面上に16色を同時に表示できることを示す。
属性テーブル中の各バイトは、画面上でタイルの4x4グループを表わす。 属性テー
ブル中の1バイトの機能が何を行うか説明する、多数の方法がある:
* 16x16ピクセルにつき、32x32ピクセルグリッドの上位2ビットを保持する。
* 16枚の8x8タイルの上位2ビットを保持する。
* 4つの4x4タイルグリッドの上位2ビットを保持する。
正直いって地獄のように混乱している。 少数の図表は、混乱する人々を助けるする
ことがある:
+------------+------------+
| Square 0 | Square 1 | #0-F represents an 8x8 tile
| #0 #1 | #4 #5 |
| #2 #3 | #6 #7 | Square [x] represents four (4) 8x8 tiles
+------------+------------+ (i.e. a 16x16 pixel grid)
| Square 2 | Square 3 |
| #8 #9 | #C #D |
| #A #B | #E #F |
+------------+------------+
Attribute Byte
----------------
%00000000
++++++++- Upper two (2) colour bits for Square 0 (Tiles #0/1/2/3)
| | +--- Upper two (2) colour bits for Square 1 (Tiles #4/5/6/7)
| +----- Upper two (2) colour bits for Square 2 (Tiles #8/9/A/B)
+------- Upper two (2) colour bits for Square 3 (Tiles #C/D/E/F)
頭の中でビットパターンを重ねたと仮定して、このすべての情報を理解することは
楽な仕事である。 類似した方法が、PC上で「MODE-X」モードとして知られている
tweakedグラフィックスモードで使用されている。 ほとんどのDOS指向のエミュレー
タは、解像度が256x256x256の「MODE-Q」として知られているものを使う。 より詳
細には、「chainedグラフィックスモード」を研究する。
イメージパレットとスプライトパレットの2個のパレットが存在する。 それらは物
理的なRGB値を持たないので、これらのパレットは実際のパレットではなく「ルック
アップテーブル」である。
NES自身はNTSC合成ビデオ信号を使うが、標準テレビセットの色にRGB値を対応させ
ることによって「エミュレート」できる。 実際の256個のRGBパレット(64個が使わ
れるが)は次のURLから得ることができる:
http://nesdev.parodius.com/loopypal.txt
さらに、イメージパレットとスプライトパレットの間にミラーが起こる。 $3F00に
書かれるすべてのデータは、$3F04、$3F08、$3F0Cにミラーされる。 $3F10に書かれ
るすべてのデータは、$3F14、$3F18、$3F1Cにミラーされる。 両方のパレット中の
色#0は透明を定義する。
+---+------------------+
| 4 | BGスクロール |
+---+------------------+
BGをパンするためにレジスタ$2005(セクション#6を参照)を使う方法に関するかなり
多くの質問があるように思える。 私自身は、このレジスタがどう動作するか正確に
理解するのにいまだにてこずっている。 しかし、Pat Mccomackのおかげで、問題が
ある人々がうまくいけばこの情報を利用できるように、私がここで記入する小さな
説明がある:
水平スクロール 垂直スクロール
0 512
+-----+-----+ +-----+0
| | | | |
| A | B | | A |
| | | | |
+-----+-----+ +-----+
| |
| B |
| |
+-----+480
ネームテーブル「A」は$2000でビット#0-1(セクション#6を参照)によって指定さ
れ、「B」はミラーに基づいて「A」の隣りである。 これは、水平、垂直スクロール
を同時に使うゲームのために動作しない。 恐らく、4スクリーンVRAM配置はこれを
修正する。
「この材料はsmb1(水平スクロール)の中で使われるが、恐らく他のゲームと同じ方
法である。 スクロールは、スキャンラインに基づくように思える、つまり、リフレ
ッシュ中に、ゲームはスクロールレジスタに異なる値を書くことができる(通常、レ
ジスタ$2002によってスプライト0 Hitを検知する時に行う)。 スクロールしたスク
リーン配置は変わることもできる。 水平スクロール時に、第1のスクリーン(0-255)
のネームテーブルはレジスタ$2000で指定されたネームテーブルであり、第2のスク
リーン(256-512)のネームテーブルは第1のものの反対であり、ミラーに基づいてい
ると私は推測する。」
この情報の提供にPatに感謝 :-) :-
+---+--------------+
| 5 | 割り込み |
+---+--------------+
6502にはIRQ/BRK、NMI、RESETの3つの割り込みがある。
各割り込みは自分のベクタを持ち、通常、ある実行されるコードを指す。 ベクタ
は、割り込みが起きる時に「ジャンプする」位置を指定する16ビットのアドレスで
ある。
6502がBRK命令を実行する時、IRQ/BRKが起きる。 BRKは多くのことに使用できる
が、一般的にマシンが不幸な状態になるので、*めったに*使われない。 しかし、エ
ミュレータ著者のために、いくつかのゲームがIRQ/BRKベクタにジャンプを強制する
ためにBRKを使うので、BRKを必ず正確にエミュレートする。 Super Nintendo(SNES)
ゲームは同様にこれを行うが、すべて異なる問題である。
NMIはマスク不能割り込みを表わし、各リフレッシュ(VBlank/VBL)で生成され、 使
用されたシステムに依存して異なる間隔で起こる。
RESETは電源投入時に起きる。 ROMがメモリにロードされ、6502はRESETベクタで指
定されたアドレスへジャンプする。 レジスタは変更されず、メモリはクリアされな
い; これらは電源投入時だけに起こる。
NMIの問題に戻る。 $2000のビット#7(セクション#6を参照)が1にセットされる場
合、NMIは50回/秒だけ実行される。 これは、リフレッシュが起こる度に割り込みを
生成する(より明確にはNMIを実行する)ようにNESに命じる。 6502の割り込み遅延は
7サイクルである; これは、割り込みに入ると出るのに7サイクルかかることを意味
する。
ほとんどの割り込みはRTI命令を使用してリターンするべきである。 ファイナルフ
ァンタジー1のようないくつかのNESカートリッジは、この方法を使用しない。 これ
らのカートリッジは非常に奇妙な方法で割り込みからリターンする:手でスタックを
操作し、次にRTSでリターンする。これは技術的に有効であるが、道義的に「悪い
」。 あなたがエミュレータ著者ならば、必ずすべてのオペコードを正しく実装す
る。そうすれば、素晴らしいはずである。 ゲームコードは残りを世話する。
次の割り込みはROMに次のベクタポイントがある:
+--------+-----------+
| Vector | Interrupt |
+--------+-----------+
| $FFFA | NMI |
| $FFFC | RESET |
| $FFFE | IRQ/BRK |
+--------+-----------+
ここに、6502の正確な割り込み優先度順がある:
+----------+-----------+
| Priority | Interrupt |
+----------+-----------+
| Highest | RESET |
| | NMI |
| Lowest | IRQ/BRK |
+----------+-----------+
+---+-------------+
| 6 | レジスタ |
+---+-------------+
アドレス:(ROMの中の)レジスタの16ビットのアドレス
統計:各レジスタはそれに対して異なる統計と「様相」がある。
これらの統計は次のように定義される:
R = レジスタは読み込み可能である。
W = レジスタは書き込み可能である。
2 = 「二度書き」レジスタ。
? = 統計は未知か、または恐らく間違っている。
ビット:ほとんどのレジスタは、トグルでon/offできるビットを持っており、NESに
様々なことを行う。
「-」(ハイフン)の付いたビットは使用されていない。
「?」の付いたビットは未知である。
[ラベル]:(プログラマのために)各レジスタに割り当てたラベル。
+---------+-------+----------+---------------------------------------------+
|アドレス | 統計 | ビット | 説明 [ラベル] |
+---------+-------+----------+---------------------------------------------+
| $2000 | W | vhzcpwNN | PPU制御レジスタ #1 [PPUCNT0] |
| | | | |
| | | | v = VBlank時にNMIを実行 |
| | | | 0 = 無効 |
| | | | 1 = 有効 |
| | | | h = スプライトHit時にNMIを実行 |
| | | | 0 = 無効 |
| | | | 1 = 有効 |
| | | | z = スプライトサイズ |
| | | | 0 = 8x8 |
| | | | 1 = 8x16 |
| | | | c = スクリーンパターンテーブルアドレス |
| | | | 0 = $0000 (VRAM) |
| | | | 1 = $1000 (VRAM) |
| | | | p = スプライトパターンテーブルアドレス |
| | | | 0 = $0000 (VRAM) |
| | | | 1 = $1000 (VRAM) |
| | | | w = PPUアドレス読み書き増加 |
| | | | 0 = 1ずつ増加 |
| | | | 1 = 32ずつ増加 |
| | | | N = ネームテーブル選択 |
| | | | 00 = $2000 (VRAM) |
| | | | 01 = $2400 (VRAM) |
| | | | 10 = $2800 (VRAM) |
| | | | 11 = $2C00 (VRAM) |
+---------+-------+----------+---------------------------------------------+
| $2001 | W | fffpcSIt | PPU制御レジスタ #2 [PPUCNT1] |
| | | | |
| | | | f = Full Background カラー |
| | | | 000 = None \ |
| | | | 001 = Red \一つだけ選択 |
| | | | 010 = Green / |
| | | | 100 = Blue / |
| | | | p = スプライト表示 |
| | | | 0 = Hide sprites |
| | | | 1 = Show sprites |
| | | | c = スクリーン表示 |
| | | | 0 = Off (screen off) |
| | | | 1 = On (screen on) |
| | | | S = スプライトクリップ |
| | | | 0 = Don't show sprites in the left |
| | | | 8-pixel column |
| | | | 1 = Show sprites everywhere |
| | | | I = イメージクリップ |
| | | | 0 = Don't show the left 8 pixels of |
| | | | the screen |
| | | | 1 = Show the left 8 pixels |
| | | | t = カラー表示 |
| | | | 0 = モノクロ表示 |
| | | | 1 = カラー表示 |
+---------+-------+----------+---------------------------------------------+
| $2002 | R | vhsW---- | PPUステータスレジスタ [PPUSTAT] |
| | | | |
| | | | v = VBlank発生フラグ |
| | | | 0 = No VBlank |
| | | | 1 = VBlank |
| | | | h = Hit発生フラグ |
| | | | 0 = No hit |
| | | | 1 = Refresh has hit スプライト#0 |
| | | | s = スプライトCount Max |
| | | | 0 = 現在のスキャンラインに8未満 |
| | | | 1 = 現在のスキャンラインに8以上 |
| | | | W = PPU書き込みステータスフラグ |
| | | | 1 = VRAMへの書き込みは有効 |
| | | | 1 = VRAMへの書き込みは無視 |
| | | | |
| | | | 注:ビット#6は次のリフレッシュの初めに0に |
| | | | リセットされる。 |
| | | | 注:最初の実際のピクセル(つまり透明でない)が |
| | | | 描画されるまでビット#6はセットされない。 |
| | | | したがって、最初の4ピクセルが透明で、5番 |
| | | | めが不透明な値のスプライト(8x8)があれば、|
| | | | 5番めのピクセルが見つかって描画された後、|
| | | | ビット6がセットされる。 |
+---------+-------+----------+---------------------------------------------+
| $2003 | W | aaaaaaaa | スプライトメモリアドレス [SPRADDR] |
| | | | |
| | | | $2004でアクセスするスプライトRAMのアドレス |
| | | | を指定する(セクション#9を参照)。 |
+---------+-------+----------+---------------------------------------------+
| $2004 | W | dddddddd | スプライトI/Oレジスタ [SPRIO] |
| | | | |
| | | | アドレス$2003で指定されたスプライトRAMの |
| | | | 読み書きに使用する。 |
+---------+-------+----------+---------------------------------------------+
| $2005 | W2 | dddddddd | BGスクロールレジスタ [BGSCROL] |
| | | | |
| | | | スクリーンの垂直と水平スクロールに使う。 |
| | | | これは二度書きレジスタである。 |
| | | | |
| | | | バイト1:水平スクロール |
| | | | バイト2:垂直スクロール |
| | | | |
| | | | スクロールされたデータは複数のネームテー |
| | | | ブルにまたがる。配置は次のとおりである: |
| | | | |
| | | | +------------+------------+ |
| | | | | #2 ($2800) | #3 ($2C00) | |
| | | | +------------+------------+ |
| | | | | #0 ($2000) | #1 ($2400) | |
| | | | +------------+------------+ |
| | | | |
| | | | 注:垂直スクロール値が>239の場合は無視され |
| | | | る。値が>239の場合、いくつかのエミュレー |
| | | | タは垂直スクロールに0を書く。 |
| | | | 注:2つのネームテーブルだけに十分なVRAMがあ |
| | | | ることを思い出す。 |
| | | | 注:VBLが生じた後、次の書き込みは水平スクロ |
| | | | ールを制御する。 |
+---------+-------+----------+---------------------------------------------+
| $2006 | W2 | aaaaaaaa | PPUメモリアドレス [PPUADDR] |
| | | | |
| | | | データを読み書きする際のVRAMのアドレスを |
| | | | 指定する。これは二度書きレジスタである。 |
| | | | 16ビットアドレスの高位バイトを最初に、低位 |
| | | | バイトを後に書く。 |
+---------+-------+----------+---------------------------------------------+
| $2007 | RW | dddddddd | PPU I/Oレジスタ [PPUIO] |
| | | | |
| | | | $2006で指定されたアドレスのVRAMの読み書き |
| | | | に使用する。 |
+---------+-------+----------+---------------------------------------------+
| $4000 | RW | CChessss | 矩形波制御レジスタ #1 |
| | | | |
| | | | C = Duty Cycle (Positive vs. Negative) |
| | | | 00 = 87.5% |
| | | | 01 = 75.0% |
| | | | 10 = 58.0% |
| | | | 11 = 25.0% |
| | | | h = Hold Note |
| | | | 0 = Don't hold note |
| | | | 1 = Hold note |
| | | | e = エンベローブ選択 |
| | | | 0 = エンベローブ可変 |
| | | | 1 = エンベローブ固定 |
| | | | s = 再生レート |
+---------+-------+----------+---------------------------------------------+
| $4001 | RW | fsssHrrr | 矩形波制御レジスタ #2 |
| | | | |
| | | | f = 周波数固定/可変選択 |
| | | | 0 = 固定 (ビット0-6無効) |
| | | | 1 = 可変 (ビット0-6有効) |
| | | | s = 周波数変更速度 |
| | | | H = Low/High 周波数選択 |
| | | | 0 = Low -> High |
| | | | 1 = High -> Low |
| | | | r = 周波数レンジ(0=最小, 7=最大) |
+---------+-------+----------+---------------------------------------------+
| $4002 | RW | dddddddd | 矩形波周波数値レジスタ #1 |
| | | | |
| | | | d = 周波数値データ (下位8ビット) |
+---------+-------+----------+---------------------------------------------+
| $4003 | RW | tttttddd | 矩形波周波数値レジスタ #2 |
| | | | |
| | | | d = 周波数値データ (上位3ビット) |
| | | | t = Active Time Length |
| | | | |
| | | | 注:周波数値は全部で11ビットのサイズであり、 |
| | | | $4003に上位3ビットを書く必要があることに |
| | | | 注意する。 |
+---------+-------+----------+---------------------------------------------+
| $4004 | RW | CChessss | 矩形波制御レジスタ #1 |
| | | | |
| | | | C = Duty Cycle (Positive vs. Negative) |
| | | | 00 = 87.5% |
| | | | 01 = 75.0% |
| | | | 10 = 58.0% |
| | | | 11 = 25.0% |
| | | | h = Hold Note |
| | | | 0 = Don't hold note |
| | | | 1 = Hold note |
| | | | e = エンベローブ選択 |
| | | | 0 = エンベローブ可変 |
| | | | 1 = エンベローブ固定 |
| | | | s = 再生レート |
+---------+-------+----------+---------------------------------------------+
| $4005 | RW | fsssHrrr | 矩形波制御レジスタ #2 |
| | | | |
| | | | f = 周波数固定/可変選択 |
| | | | 0 = 固定 (ビット0-6無効) |
| | | | 1 = 可変 (ビット0-6有効) |
| | | | s = 周波数変更速度 |
| | | | H = Low/High 周波数選択 |
| | | | 0 = Low -> High |
| | | | 1 = High -> Low |
| | | | r = 周波数レンジ(0=最小, 7=最大) |
+---------+-------+----------+---------------------------------------------+
| $4006 | RW | dddddddd | 矩形波周波数値レジスタ #1 |
| | | | |
| | | | d = 周波数値データ (下位8ビット) |
+---------+-------+----------+---------------------------------------------+
| $4007 | RW | tttttddd | 矩形波周波数値レジスタ #2 |
| | | | |
| | | | d = 周波数値データ (上位3ビット) |
| | | | t = Active Time Length |
| | | | |
| | | | 注:周波数値は全部で11ビットのサイズであり、 |
| | | | $4007に上位3ビットを書く必要があることに |
| | | | 注意する。 |
+---------+-------+----------+---------------------------------------------+
| $4008 | RW | CChessss | 三角波制御レジスタ #1 |
| | | | |
| | | | C = Duty Cycle (Positive vs. Negative) |
| | | | 00 = 87.5% |
| | | | 01 = 75.0% |
| | | | 10 = 58.0% |
| | | | 11 = 25.0% |
| | | | h = Hold Note |
| | | | 0 = Don't hold note |
| | | | 1 = Hold note |
| | | | e = エンベローブ選択 |
| | | | 0 = エンベローブ可変 |
| | | | 1 = エンベローブ固定 |
| | | | s = 再生レート |
+---------+-------+----------+---------------------------------------------+
| $4009 | RW | fsssHrrr | 三角波制御レジスタ #2 |
| | | | |
| | | | f = 周波数固定/可変選択 |
| | | | 0 = 固定 (ビット0-6無効) |
| | | | 1 = 可変 (ビット0-6有効) |
| | | | s = 周波数変更速度 |
| | | | H = Low/High 周波数選択 |
| | | | 0 = Low -> High |
| | | | 1 = High -> Low |
| | | | r = 周波数レンジ(0=最小, 7=最大) |
+---------+-------+----------+---------------------------------------------+
| $400A | RW | dddddddd | 三角波周波数値レジスタ #1 |
| | | | |
| | | | d = 周波数値データ (下位8ビット) |
+---------+-------+----------+---------------------------------------------+
| $400B | RW | tttttddd | 三角波周波数値レジスタ #2 |
| | | | |
| | | | d = 周波数値データ (上位3ビット) |
| | | | t = Active Time Length |
| | | | |
| | | | 注:周波数値は全部で11ビットのサイズであり、 |
| | | | $400Bに上位3ビットを書く必要があることに |
| | | | 注意する。 |
+---------+-------+----------+---------------------------------------------+
| $400C | RW | CChessss | ノイズ制御レジスタ #1 |
| | | | |
| | | | C = Duty Cycle (Positive vs. Negative) |
| | | | 00 = 87.5% |
| | | | 01 = 75.0% |
| | | | 10 = 58.0% |
| | | | 11 = 25.0% |
| | | | h = Hold Note |
| | | | 0 = Don't hold note |
| | | | 1 = Hold note |
| | | | e = エンベローブ選択 |
| | | | 0 = エンベローブ可変 |
| | | | 1 = エンベローブ固定 |
| | | | s = 再生レート |
+---------+-------+----------+---------------------------------------------+
| $400D | RW | fsssHrrr | ノイズ制御レジスタ #2 |
| | | | |
| | | | f = 周波数固定/可変選択 |
| | | | 0 = 固定 (ビット0-6無効) |
| | | | 1 = 可変 (ビット0-6有効) |
| | | | s = 周波数変更速度 |
| | | | H = Low/High 周波数選択 |
| | | | 0 = Low -> High |
| | | | 1 = High -> Low |
| | | | r = 周波数レンジ(0=最小, 7=最大) |
+---------+-------+----------+---------------------------------------------+
| $400E | RW | dddddddd | 周波数値レジスタ #1 |
| | | | |
| | | | d = 周波数値データ (下位8ビット) |
+---------+-------+----------+---------------------------------------------+
| $400F | RW | tttttddd | 周波数値レジスタ #2 |
| | | | |
| | | | d = 周波数値データ (上位3ビット) |
| | | | t = Active Time Length |
| | | | |
| | | | 注:周波数値は全部で11ビットのサイズであり、 |
| | | | $400Fに上位3ビットを書く必要があることに |
| | | | 注意する。 |
+---------+-------+----------+---------------------------------------------+
| $4010 | RW | CChessss | PCM制御レジスタ #1 |
| | | | |
| | | | C = Duty Cycle (Positive vs. Negative) |
| | | | 00 = 87.5% |
| | | | 01 = 75.0% |
| | | | 10 = 58.0% |
| | | | 11 = 25.0% |
| | | | h = Hold Note |
| | | | 0 = Don't hold note |
| | | | 1 = Hold note |
| | | | e = エンベローブ選択 |
| | | | 0 = エンベローブ可変 |
| | | | 1 = エンベローブ固定 |
| | | | s = 再生レート |
+---------+-------+----------+---------------------------------------------+
| $4011 | RW | vvvvvvvv | PCM音量制御レジスタ |
| | | | |
| | | | v = 音量 |
+---------+-------+----------+---------------------------------------------+
| $4012 | RW | aaaaaaaa | PCMアドレスレジスタ |
| | | | |
| | | | a = アドレス |
+---------+-------+----------+---------------------------------------------+
| $4013 | RW | LLLLLLLL | PCMデータ長レジスタ |
| | | | |
| | | | L =データサイズ/長さ |
+---------+-------+----------+---------------------------------------------+
| $4014 | W | | スプライトDMA [SPRDMA] |
| | | | |
| | | | このレジスタに書かれた値がNとすると、アド |
| | | | レス$100*NのメモリをスプライトRAMへ256バイ |
| | | | ト転送する。 |
+---------+-------+----------+---------------------------------------------+
| $4015 | RW | ---abcde | サウンド制御レジスタ [SNDCNT] |
| | | | |
| | | | e = チャンネル1 (0=無効, 1=有効) |
| | | | d = チャンネル2 (0=無効, 1=有効) |
| | | | c = チャンネル3 (0=無効, 1=有効) |
| | | | b = チャンネル4 (0=無効, 1=有効) |
| | | | a = チャンネル5 (0=無効, 1=有効) |
+---------+-------+----------+---------------------------------------------+
| $4016 | RW | ???STeed | ジョイパッド #1 [SPECIO1] |
| | | | [READING] |
| | | | |
| | | | S = Zapper sprite detection |
| | | | 0 = スプライトnot detected |
| | | | 1 = スプライトdetected in front of |
| | | | crosshair |
| | | | T = Zapper trigger |
| | | | 0 = Pressed |
| | | | 1 = Not pressed |
| | | | e = 拡張ポートデータ |
| | | | d = ジョイパッドデータ (セクション#8参照) |
| | | +---------------------------------------------+
| | | ?????eej | [WRITING] |
| | | | |
| | | | j = ジョイパッドストローブ |
| | | | 0 = Clear joypad strobe |
| | | | 1 = Reset joypad strobe |
| | | | e = 拡張ポートデータ |
+---------+-------+----------+---------------------------------------------+
| $4017 | R | ???STeed | ジョイパッド #2 [SPECIO2] |
| | | | |
| | | | S = Zapper sprite detection |
| | | | 0 = スプライトnot detected |
| | | | 1 = スプライトdetected in front of |
| | | | crosshair |
| | | | T = Zapper trigger |
| | | | 0 = Pressed |
| | | | 1 = Not pressed |
| | | | e = 拡張ポートデータ |
| | | | d = ジョイパッドデータ (セクション#8参照) |
+---------+-------+----------+---------------------------------------------+
+---+------------------+
| 7 | VBL/Hit Bits |
+---+------------------+
VBlankフラグは、読み出し専用の位置$2002の第7ビットに含まれている。 PPUがス
クリーンを走査しているか垂直帰線信号を生成しているかを示す。 各フレームの最
後(スキャンライン232)でセットされ、スキャンライン8からの次のスクリーンリフ
レッシュ開始まで残る。 プログラムは、$2002を読むことによりこのビットを早々
にリセットできる。
Hitフラグは、読み出し専用の位置$2002の第6ビットに含まれている。 スプライト
#0が位置する場所で、PPUが第1のスキャンラインをリフレッシュし始める時、1にな
る。 例えば、スプライト#0のY座標が34の場合、Hitフラグはスキャンライン34でセ
ットされる。 垂直帰線信号が始まる時、Hitフラグがリセットされる。 プログラム
は、$2002から読むことによりこのビットを早々にリセットできる。
+---+-------------------------+
| 8 | ジョイパッド/Zapper |
+---+-------------------------+
位置$4016と$4017でアクセスされる2つのジョイスティックがある。 ジョイスティ
ックをリセットするためには、$4016に最初に1、その後0を書き込む。 この方法
で、ジョイスティックの回路にストローブを生成する。 その後、$4016(ジョイステ
ィック0)または$4017(ジョイスティック1)のいずれかから読む。 各読み取りは、第
0ビットに単一のボタンの状態を与える(押されれば1、そうでなければ0):
+--------+-----+-----+--------+-------+----+------+------+-------+
| Read # | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+--------+-----+-----+--------+-------+----+------+------+-------+
| A | B | SELECT | START | UP | DOWN | LEFT | RIGHT |
+-----+-----+--------+-------+----+------+------+-------+
各ビットに関する詳細に関しては$4016/$4017でセクション#6を参照する。
+---+----------------+
| 9 | スプライト |
+---+----------------+
8x8または8x16ピクセルのいずれかの64個のスプライトがある。 スプライトパター
ンはPPUメモリのパターンテーブルに格納される。 256バイトのスプライトメモリ
(CPUやPPUアドレス空間の一部ではない)にスプライト属性を格納する。 スプライト
メモリの全内容はDMAによって書くことができる(セクション#6を参照)。 スプライ
トメモリは、さらに、$2003へ開始アドレスを書き、次に$2004を読み書きすること
により1バイトずつアクセスできる(各アクセスの後にアドレスが自動的に増加する
)。 スプライトRAMの形式は次のとおりである:
+--------------+--------------+-----+---------------+---------------+
| スプライト#0 | スプライト#1 | ... | スプライト#62 | スプライト#63 |
+--------------+--------------+-----+---------------+---------------+
| +--------+----------+-----------------------------------------+
+----+ Byte # | Bits | 説明 |
+--------+----------+-----------------------------------------+
| 0 | YYYYYYYY | スプライトY座標 - 1 |
| | | スプライトの左上隅の座標 |
| 1 | IIIIIIII | スプライトタイルインデックス番号 |
| 2 | vhp000cc | 色/属性 |
| | | v = 垂直反転 (1=反転) |
| | | h = 水平反転 (1=反転) |
| | | p = スプライト優先度ビット |
| | | 0 = スプライトはBGの手前 |
| | | 1 = スプライトはBGの後 |
| | | c = 色の上位2ビット |
| 3 | XXXXXXXX | スプライトX座標 (左上隅) |
+--------+----------+-----------------------------------------+
スプライトタイルインデックス番号は、タイルインデックス番号とネームテーブル
(BG)ピクチャの関係と同じ方法で得られる。
8x16スプライトでは、パターンテーブルはVRAMの$0000にあり、256個の8x16タイル
を含んでいる。 $2000のビット#3(セクション#6を参照)は8x16スプライトに効果が
ない。 スプライト属性RAMの中のスプライトタイルインデックス番号は、描画時に
PPUによって1ビット右ローテートされる。 したがって、タイルインデックス#$01は
タイル#128を描画し、$02はタイル#1を描画し、、$03はタイル#129を描画する、な
ど。
スプライト優先度ビットは次のように動作する:スプライトがこのビットをセット
し、同じ位置でスプライトより高い優先度を持っていれば、BGは両方のスプライト
の前に表示される。
スキャンラインにつき8個のスプライトだけが表示できる。 スプライトRAMの中の各
スプライトエントリは、他のスプライトの水平の範囲の中にあるかどうかチェック
される。 これは1スキャンライン毎に行われ、スプライト毎でないこと思い出す
(例えば、これは256/8や256/16回ではなく256回を行われる)。
+----+----------+
| 10 | MMCs |
+----+----------+
下記の個々の参照番号(例えば「3)」や「1)」)」はiNESマッパ番号である。 利用可
能であれば、実際のMMCタイトルが後に印刷される。 これらを混同しないこと。
1) 任天堂MMC1
MMC1は、一般に256Kと512Kのカートリッジで使われる。 PRG-ROMとCHR-RAMを切り替
えるために使われることがある。 このMMCはさらにWRAMをサポートする。
MMC1には4つの8ビットレジスタがあり、次のアドレスでアクセスされる:
+-------+-------+----------+--------------------------------------------+
| Reg # | Range | Bits | 説明 |
+-------+-------+----------+--------------------------------------------+
| 0 | $8000 | ????BKpm | MMC制御レジスタ #1 |
| | ... | | |
| | $9FFF | | B = Base Bootup選択 |
| | | | 0 = $8000 (注:たぶん間違っている) |
| | | | 1 = $C000 |
| | | | K = バンクサイズ |
| | | | 0 = 16K |
| | | | 1 = 32K |
| | | | p = Panning/Scrolling 有効/無効 |
| | | | 0 = 有効 |
| | | | 1 = 無効 |
| | | | m = ミラー選択 |
| | | | 0 = 水平ミラーリング |
| | | | 1 = 垂直ミラーリング |
| | | | |
| | | | 注:ビット#1が1にセットされた時、実際には |
| | | | ネームテーブル#0だけを他のすべてのネー |
| | | | ムテーブルの全体にわたってミラーする。 |
+-------+-------+----------+--------------------------------------------+
| 1 | $A000 | ???mCCCC | MMC制御レジスタ #2 |
| | ... | | |
| | $BFFF | | m = Multi Function |
| | | | [Cart w/ VROM] |
| | | | 0 =選択 8K CHR-RAM at $0000 |
| | | | 1 = Swap 4K at $0000 and $1000 |
| | | | [Cart w/out VROM] |
| | | | 0 =選択 lower 256K of PRG-ROM |
| | | | 1 =選択 upper 256K of PRG-ROM |
| | | | C = CHR-RAM ページ選択 at $0000 (VRAM) |
+-------+-------+----------+--------------------------------------------+
| 2 | $C000 | ssssssss | CHR-RAM 4K ページ選択レジスタ |
| | ... | | |
| | $DFFF | | 4K CHR-RAMページがレジスタ#0で選択されて |
| | | | いる場合のみ$1000の4K CHR-RAMページをセッ |
| | | | トする(そうでなければ無視する)。 |
+-------+-------+----------+--------------------------------------------+
| 3 | $E000 | ssssssss | PRG-ROM 16K ページ選択レジスタ |
| | ... | | |
| | $FFFF | | $8000の16K ROMページをセットする。 |
| | | | $C000のページは、カートリッジの最後のROM |
| | | | ページにハードワイヤされる。 |
+-------+-------+----------+--------------------------------------------+
マッパレジスタに初めて書く前に、各アドレスへのデータがそれ自体を並べると書 く前に、各アドレス範囲ベース($8000、$A000、$C000と$E000)の中でビット#7をセ
ットすることによりそれをリセットする必要がある。 一度これを行ったならば、適
切なアドレス範囲に値を少しずつ書くことができる。 例えば、次のコードはレジス
タ3に$0Cを書き込む:
lda #%10000000
sta $8000 ; Resetting range #0
sta $A000 ; Resetting range #1
sta $C000 ; Resetting range #2
sta $E000 ; Resetting range #3
lda #$0C ; This is our value
sta $EFD9 ; Writing bit 0
lsr a ; Shifting
sta $EFD9 ; Writing bit 1
lsr a ; Shifting
sta $EFD9 ; Writing bit 2
lsr a ; Shifting
sta $EFD9 ; Writing bit 3
lsr a ; Shifting
sta $EFD9 ; Writing bit 4
「512K」カートリッジ(Dragon Warrior 3のような)では、レジスタ#0のビット#4に
注意を払う。 これらのカートリッジがPRG-ROM、ビット#4は256K選択レジスタとし
ての機能を決して持っていないとともに。
最後に、「512K」カートリッジでは、$C000-$FFFFは低位256KのPRG-ROMエリアの最
後の16Kにハードワイヤされる。
2) 74HC161/74HC32マッパ
このマッパは、PRG-ROMバンクを16Kサイズで単に切り替える。 このマッパを備えた
カートリッジはすべて、$0000で8KのCHR-RAMを含んでいる。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $8000 | W | PPPPPPPP | PRG-ROM制御レジスタ |
| ... | | | |
| $FFFF | | | P = 16K PRG-ROM Bank |
+---------+-------+----------+---------------------------------------------+
注:最後の16K PRG-ROMページは$C000にハードワイヤされる。
注:カートリッジは$8000でPRG-ROMバンク#0で始まる。
3) VROMスイッチ
このマッパは、単にCHR-RAMバンクを8Kサイズで切り替える。 PRG-ROMは16Kか32Kで
あり、切り替えることができない。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $8000 | W | CCCCCCCC | CHR-RAM制御レジスタ |
| ... | | | |
| $FFFF | | | C = 8K CHR-RAM Bank at $0000 (VRAM) |
+---------+-------+----------+---------------------------------------------+
4) 任天堂MMC3
このMMCは、次のような多くの最近のカートリッジで使われる: Batman Returns,
Super Contra, Vindicators, Silver Surfer, Crystalis, Legacy of the Wizardな
ど。 このMMCはIRQライン経由で独自の割り込みを生成することができ、PRG-ROMと
CHR-RAMを切り替える1組みのコマンドがある。 CHR-RAMページは1Kであり、PRG-ROM
は8Kである。
注:機能選択レジスタ(次を参照)のビット#6が0の場合、PRG-ROMの最後の2つの8Kペ
ージは$C000と$E000にハードワイヤされる。 1にセットされる場合、ハードワイヤ
使用は$8000と$E000に影響する。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $8000 | W ? | as???ddd | Function選択レジスタ |
| | | | |
| | | | a = CHR-RAM Baseアドレス選択 |
| | | | 0 = $0000 |
| | | | 1 = $1000 |
| | | | s = PRG-ROM Page Base選択 |
| | | | 0 = $8000と$A000を選択 |
| | | | 1 = $A000と$C000を選択 |
| | | | ddd = CMD # (0-7) |
| | | | |
| | | | 注:ビット#6はCMD 6と7だけに影響する。 |
| | | | 注:このレジスタへの書き込みは、$E000レジ |
| | | | スタに作られた変更をリセットする。 |
+---------+-------+----------+---------------------------------------------+
| $8001 | W | dddddddd | Page Number選択レジスタ |
| | | | |
| | | | This register selects the page # to be |
| | | | read from (or written to). |
| | | | |
| | | | 注:CMD 0を使う時、このレジスタのビット#0が |
| | | | 無視される。したがって、5の値はページ |
| | | | 4と5を選択する。 |
+---------+-------+----------+---------------------------------------------+
| $A000 | W | ???????m | Shadow選択レジスタ |
| | | | |
| | | | m = Shadowing |
| | | | 0 = 垂直 |
| | | | 1 = 水平 |
+---------+-------+----------+---------------------------------------------+
| $A001 | W ? | p??????? | パターンテーブル制御レジスタ |
| | | | |
| | | | p = パターンテーブル有効/無効 |
| | | | 0 = VRAMの$0000-$1FFFの使用無効 |
| | | | 1 = VRAMの$0000-$1FFFの使用有効 |
| | | | |
| | | | 注:ここの情報は恐らく間違いかもしれない。 |
+---------+-------+----------+---------------------------------------------+
| $C000 | | dddddddd | IRQ Decrementレジスタ |
| | | | |
| | | | 値(1-255)をここに書き込む。チップはすべ |
| | | | てのスキャンラインでこの値を自動的に減少 |
| | | | する。一度0になれば、IRQ/BRKが実行される。 |
| | | | 0が格納される場合、この機能は無効である。 |
+---------+-------+----------+---------------------------------------------+
| $C001 | W | | Temporary Latchレジスタ |
+---------+-------+----------+---------------------------------------------+
| $E000 | W | | IRQ制御レジスタ #1 |
| | | | |
| | | | このレジスタへ何か書き込むと、$C001に書 |
| | | | き込まれた値を$C000にコピーする。 |
| | | | IRQはさらに同様に無効になる。 |
+---------+-------+----------+---------------------------------------------+
| $E001 | W | | IRQ制御レジスタ #2 |
| | | | |
| | | | このレジスタへ何か書き込むとIRQを有効にする|
+---------+-------+----------+---------------------------------------------+
MMC機能を作るために、最初に$8000へコマンド番号、次に$8001へ値(ページ番号)を
書き込まなければならない。下記コマンドが存在する:
+-------+---------+--------------------------------------------------------+
| CMD # | アドレス | 説明 |
+-------+---------+--------------------------------------------------------+
| 0 | $0000 | このアドレスの2つの1K CHR-RAMページの選択 |
| 1 | $0800 | このアドレスの2つの1K CHR-RAMページの選択 |
| 2 | $1000 | このアドレスの1つの1K CHR-RAMページの選択 |
| 3 | $1400 | このアドレスの1つの1K CHR-RAMページの選択 |
| 4 | $1800 | このアドレスの1つの1K CHR-RAMページの選択 |
| 5 | $1C00 | このアドレスの1つの1K CHR-RAMページの選択 |
+-------+---------+--------------------------------------------------------+
| 6 | N/A |選択s one (1) 8K PRG-ROM Page at the CHR-RAM Page |
| | | Base選択. 初期値は0. |
+-------+---------+--------------------------------------------------------+
| 7 | N/A |選択s one (1) 8K PRG-ROM Page at the CHR-RAM Page |
| | | Base選択. 初期値は1. |
+-------+---------+--------------------------------------------------------+
注:CMD 0-5に関しては、ページ番号選択レジスタ($8001)を参照する。 CMD 6-7に関
しては、機能選択レジスタ($8000)を上に参照する。
注:アドレスは実際には「CHR-RAMベースアドレスXOR(アドレス)」である。 したが
って、CHR-RAMベースアドレスが$1000にセットされる場合、CMD#4の使用は、VRAMの
$2800への転送に帰着する。
5) 任天堂MMC5
このマッパはCastlevania IIIの中で使われる。 使用するために4つの物理的なネー
ムテーブルを割り当てて、4スクリーンネームテーブル配置をサポートする。
このマッパは、外部RAM(EXRAM)($5C00-$5FFFにマップされる)の1Kのセクションをサ
ポートする。 EXRAMは、960個の8x8タイルの各々に対応している1バイトを保持す
る。 EXRAMバイトの形式は:
+----------+-------------------------------------------------+
| Bits | 説明 |
+----------+-------------------------------------------------+
| ccIIIIII | c = カラー拡張 |
| | |
| | 悩まされる4x4タイル属性ビット制限をなくす。 |
| | これらのビットの使用はオプションである。 |
| | |
| | I = インデックス拡張 |
| | |
| | ネームテーブルでこれらの6ビットを使うこと |
| | で、最大のインデックスタイル番号を256から |
| | 16384(8ビットから14ビット)まで拡張する。 |
| | e.g.: |
| | |
| | IIIIIInnnnnnnn |
| | +--+-++---+--+ |
| | | +--- ネームテーブル |
| | +---------- インデックス拡張 |
+----------+-------------------------------------------------+
レジスタ$5104は、CPUがEXRAMに書き込み可能かどうかと、EXRAMの中の色拡張ビッ
トを使うかどうかを制御できる。
さらにMMC5は垂直と水平ミラーをフリップできるレジスタがあるように思える。 こ
のレジスタは、Castlevania IIIの中で明確に使われる。
6) FFE F4xxxマッパ
このマッパはPRG-ROMを交換することができ、4つのパターンテーブルをサポートす
る。 このマッパはNESバックアップユニット/開発システムのためにFFE(Front Far
East)によって発明され、有名なWai Wai World(「Konami World」)、Getsufuu
MadenなどのようなF4xxx-スタイルのゲーム上でのみ使われるようにみえる。 さら
に、任天堂のMMC3に似て、IRQとカウンタレジスタをサポートする。
2つのスタイルのデータをここに書くことができるが、通常、より一般に用いられて
いるデータ(「Wai Wai World」の中で使用された)の形式は:
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $42FC | W | pppppppp | PRG-ROM Write 有効 |
| $42FD | W | mmmmmmmm | Mirroring Write 有効 |
| $42FE | W | ???p???? | PRG-ROM Swap |
| $42FF | W | ???m???? | ミラー選択 |
| | | | m = ミラー選択 |
| | | | 0 = 垂直 |
| | | | 1 = 水平 |
| $43FE | W | CCCCCCpp | 4mb PRG-ROM/CHR-RAM選択 |
| $4500 | RW | eXssWPPP | Configurationレジスタ |
| | | | e = Disk/Cart Mode |
| | | | 0 = Famicom Disk game |
| | | | 1 = Famicom cart |
| | | | X = Execute Mode |
| | | | 0 = Do nothing |
| | | | 1 = Execute game |
| | | | s = SRAM Availability |
| | | | 0 = Not used |
| | | | 1 = SRAM used |
| | | | W = SW Pin |
| | | | PPP = PPUMode |
| | | | 010 = 256K |
| | | | 101 = 2M + Extended VRAM |
| | | | 111 = 2M |
| $4501 | W | iiiiiiii | IRQ無効 |
| $4502 | W | iiiiiiii | IRQ増加レジスタ(下位バイト) |
| $4503 | W | iiiiiiii | IRQ有効 & 増加レジスタ(上位バイト) |
| $8000 | RW | --ppppCC | PRG-ROM/CHR-RAM制御レジスタ |
| $A000 | | | |
| $C000 | | | p = 16K PRG-ROM選択 |
| $E000 | | | $8000のPRG-ROMバンクの選択 |
| | | | CC = パターンテーブル選択 |
| | | | パターンテーブル#0-3の選択 |
+---------+-------+----------+---------------------------------------------+
IRQカウンタのサポートは、増加、減少されないこと以外は、MMC3に非常に似てい
る。 値が$FFFFに達した時、$0000にリセットされる。 IRQカウンタの使用を可能に
するためには、$4503へ値$0000を格納する。
このマッパは、さらにトレーナの使用をサポートする。 トレーナは$7000-71FFにロ
ードされる。 個々の説明された下記の項目は、ベクタではなく実際の6502コードで
ある(例えばJMP$xxxx)。 アドレス自身はベクタで*ある*。
+---------+---------------------------------------------+
|アドレス | 説明 |
+---------+---------------------------------------------+
| $7000 | NMI |
| $7003 | Game Setup code |
| $7006 | Mirroring Switch |
| $7009 | Other trainer routines |
| ... | |
+---------+---------------------------------------------+
注:これらのイメージのほとんどは純粋にPRG-ROMであるように思える; つまり
CHR-RAMはない。 すべてのCHR-RAMはPRG-ROMの内部に保持され、MMCによって実行時
に交換される。
ここの文書はまだ完全ではない; より正確で詳しい文書のために、このURLでマッパ
#6に関するFanWenの文書をチェックする:
http://nesdev.parodius.com/mapper6.txt
7) ROMスイッチ
このマッパは、単にPRG-ROMバンクを32Kサイズで切り替える。 さらに、どのネーム
テーブルと属性テーブルを使うか指定することができる。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $8000 | W | ???nPPPP | PRG-ROM制御レジスタ |
| ... | | | |
| $FFFF | | | P = $8000の32K PRG-ROMバンク |
| | | | n = ネーム/属性テーブル選択 |
| | | | 0 = $2000 (VRAM) |
| | | | 1 = $2400 (VRAM) |
+---------+-------+----------+---------------------------------------------+
注:残りのネームテーブルと属性テーブルは、ビット#4で選択されたもののちょうど
ミラーである。
8) FFE F3xxxマッパ
情報は現在利用可能ではない。
9) 任天堂MMC2
このMMCは「マイクタイソンのパンチアウト!」カートリッジのアメリカ版で使われ
る。 PRG-ROMとCHR-RAMの切り替えをサポートする。
PRG-ROMバンクは、$8000のベースROMアドレスと共に、サイズにして8Kである。
CHR-RAMバンクのサイズは4Kである。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $A000 | W | dddddddd | PRG-ROM 8K ページ選択レジスタ |
| ... | | | |
| $AFFF | | | d = 8K PRG-ROM選択 |
| | | | $8000の8K PRG-ROMバンクの選択 |
| | | | |
| $B000 | W | dddddddd | CHR-RAM 4K ページ選択レジスタ #1 |
| $C000 | | | |
| | | | d = 4K CHR-RAM選択 |
| | | | VRAMアドレス$0000の4K CHR-RAMバンク |
| | | | の選択 |
| | | | |
| $D000 | W | dddddddd | CHR-RAM 4K ページ選択レジスタ #2 |
| $E000 | | | |
| | | | d = 4K CHR-RAM選択 |
| | | | VRAMアドレス$1000の4K CHR-RAMバンク |
| | | | の選択 |
+---------+-------+----------+---------------------------------------------+
カートリッジの最後の3つのPRG-ROMバンクは、ROMの最後の3つの8Kのセクションに
ハードワイヤされる。 例えば「マイクタイソンのパンチアウト!」の場合には どれ
に16の(16)8KのPRG-ROMバンク、PRG-ROMバンク#13、#14と#15があるかは、$A000、
$C000と$E000それぞれにマップされる。
注:CHR-RAM 4Kページ選択レジスタは、一致で動作するように思える; つまり、デー
タが$B000に書かれた場合、$D000は機能するが、$E000は機能しない(したがって、
$D000が動作しないところで、同じ規則は$C000/$E000に適用される)。
10) 任天堂MMC4
このMMCは「マイクタイソンのパンチアウト!」カートリッジの日本のバージョンの
中で使われる。 PRG-ROMとCHR-RAMの切り替えをサポートする。
PRG-ROMバンクのサイズは16Kであり、CHR-RAMバンクは4Kである。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $A000 | W | pppppppp | PRG-ROM ページ選択レジスタ |
| | | | |
| | | | p = 32K PRG-ROM選択 |
| | | | $8000の16K PRG-ROMバンクの選択 |
+---------+-------+----------+---------------------------------------------+
| $B000 | W | CCCCCCCC | CHR-RAM ページ選択レジスタ #1 |
| | | | |
| | | | C = 4K CHR-RAM選択 |
| | | | VRAMアドレス$0000の4K CHR-RAMバンク |
| | | | の選択 |
+---------+-------+----------+---------------------------------------------+
| $C000 | W | CCCCCCCC | CHR-RAM ページ選択レジスタ #2 |
| | | | |
| | | | C = 4K CHR-RAM選択 |
| | | | VRAMアドレス$1000の4K CHR-RAMバンク |
| | | | の選択 |
+---------+-------+----------+---------------------------------------------+
| $D000 | W | CCCCCCCC | CHR-RAM ページ選択レジスタ #3 |
| | | | |
| | | | C = 4K CHR-RAM選択 |
| | | | VRAMアドレス$0000の4K CHR-RAMバンク |
| | | | の選択 |
+---------+-------+----------+---------------------------------------------+
| $E000 | W | CCCCCCCC | CHR-RAM ページ選択レジスタ #4 |
| | | | |
| | | | C = 4K CHR-RAM選択 |
| | | | VRAMアドレス$1000の4K CHR-RAMバンク |
| | | | の選択 |
+---------+-------+----------+---------------------------------------------+
| $F000 | W | dddddddd | ミラー選択レジスタ |
| | | | |
| | | | d = ミラー選択 |
| | | | 0 = 水平 |
| | | | 1 = 垂直 |
+---------+-------+----------+---------------------------------------------+
このマッパは特にVRAMへのアクセス時に、いくつかの非常に特殊な面がある。 上に
リストされたCHR-RAMページ選択レジスタは、VRAMのどのアドレスにアクセスしたか
に依存して自動的に「有効」と「無効」になる。
+--------------------+---------------------------------------------+
| VRAMアドレス範囲 | 説明 |
+--------------------+---------------------------------------------+
| $0FD8-0FDF | Switches VRAM $0000-0FFF swapping to $C000 |
| $0FE8-0FEF | Switches VRAM $0000-0FFF swapping to $B000 |
| $1FD8-1FDF | Switches VRAM $1000-1FFF swapping to $E000 |
| $1FE8-1FEF | Switches VRAM $1000-1FFF swapping to $D000 |
+--------------------+---------------------------------------------+
11) Color Dreamsマッパ
このマッパは、Color Dreamsゲームの中で一般に使われるが、このマッパを使用し
た場合、それらのすべては正確に機能するとは限らない。
PRG-ROMバンクのサイズは32Kであり、CHR-RAMバンクは8Kである。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $8000 | W | CCCCpppp | PRG-ROM/CHR-RAM ページ選択レジスタ |
| ... | | | |
| $FFFF | | | C = 8K CHR-RAM選択 |
| | | | VRAMアドレス$0000の8K CHR-RAMバンク |
| | | | の選択 |
| | | | p = 32K PRG-ROM選択 |
| | | | $8000の32K PRG-ROMバンクの選択 |
+---------+-------+----------+---------------------------------------------+
12) FFE F6xxマッパ
情報は現在利用可能ではない。
13) [未使用]
14) [未使用]
15) 100-イン-1マッパ
注:ROM16k[]は16KのPRG-ROMバンクの配列と仮定する。 注:他のMMCと異なり、スタ
ートアップで$C000にロードされる16K PRG-ROMは、最後の16K PRG-ROMページではな
く第2の16K PRG-ROMページである。
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $8000 | W ? | smNNNNNN | PRG-ROM制御レジスタ #1 |
| | | | |
| | | | s = Swap 8K Pages |
| | | | Swaps 8K at $8000 and $A000 |
| | | | Swaps 8K at $C000 and $E000 |
| | | | m = ミラーリング制御 |
| | | | 0 = 垂直 |
| | | | 1 = 水平 |
| | | | N = PRG-ROM ページ選択 |
| | | | $8000 now holds ROM16k[N] |
| | | | $C000 now holds ROM16k[N+1] |
+---------+-------+----------+---------------------------------------------+
| $8001 | W | s?NNNNNN | PRG-ROM制御レジスタ #2 |
| | | | |
| | | | s = Swap 8K Pages |
| | | | Swaps 8K at $C000 and $E000 |
| | | | N = PRG-ROM ページ選択 |
| | | | $C000 now holds ROM16k[N] |
+---------+-------+----------+---------------------------------------------+
| $8002 | W | S?NNNNNN | PRG-ROM制御レジスタ #3 |
| | | | |
| | | | S = 高位/低位 8K選択 |
| | | | 0 = 16Kセグメントの低位8Kの選択 |
| | | | 1 = 16Kセグメントの高位8Kの選択 |
| | | | N = 8K PRG-ROM ページ選択 |
| | | | $8000 now holds ROM16k[N] |
| | | | $A000 now holds ROM16k[N] |
| | | | $C000 now holds ROM16k[N] |
| | | | $E000 now holds ROM16k[N] |
| | | | |
| | | | NOTE: Bit 7 handles only Bits 0-5 of this |
| | | | register, and does not affect any |
| | | | other registers. |
| | | | |
| | | | NOTE: Bits 0-5 base their 8K選択 on |
| | | | Bit 7. Keep this in mind. |
+---------+-------+----------+---------------------------------------------+
| $8003 | W | smNNNNNN | PRG-ROM制御レジスタ #4 |
| | | | |
| | | | s = Swap 8K Pages |
| | | | Swaps 8K at $C000 and $E000 |
| | | | m = ミラーリング制御 |
| | | | 0 = 垂直 |
| | | | 1 = 水平 |
| | | | N = ROM ページ選択 |
| | | | $C000 now holds ROM16k[N] |
+---------+-------+----------+---------------------------------------------+
注:ビット7はこのレジスタのビット0-5だけを扱い、他のレジスタに影響しない。
注:ビット0-5はビット7にそれらの8Kの選択を基づかせる。 これを覚えておくこ
と。
16) バンダイマッパ
このマッパは、PRG-ROMの32Kと、CHR-RAMの8Kだけを使用し、両方とも交換できる。
実際のバンク切り替えはマッパ#2に似ている:
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $8000 | W ? | ??PP??CC | PRG-ROM & CHR-RAM制御レジスタ |
| ... | | | |
| $FFFF | | | P = 32K PRG-ROM Page |
| | | | C = 8K CHR-RAM Page |
+---------+-------+----------+---------------------------------------------+
17) FFE F8xxxマッパ
情報は現在利用可能ではない。
18) Jaleco SS8806マッパ
情報は現在利用可能ではない。
19) Namcot 106マッパ
情報は現在利用可能ではない。
20) Famicomディスクシステムマッパ
より詳細に関しては、セクション#13を参照する。
21) Konami VRC4マッパ
情報は現在利用可能ではない。
22) Konami VRC2マッパ#1
情報は現在利用可能ではない。
23) Konami VRC2マッパ#2
情報は現在利用可能ではない。
24) Konami VRC6マッパ
情報は現在利用可能ではない。
25) [未使用]
26) [未使用]
27) [未使用]
28) [未使用]
29) [未使用]
30) [未使用]
31) [未使用]
32) Irem G-101マッパ
情報は現在利用可能ではない。
33) Taito TC0190/TC0350マッパ
情報は現在利用可能ではない。
34) iNESマッパ#34
このマッパは、Mission Impossible 2, Deadly Towers, 3D Worldrunnerによって使
われる。 PRG-ROMの32KとCHR-RAMの8Kを(4Kのセクションで)交換するために使用で
きる:
実際のバンク切り替えはROMスイッチ(#7)に似ている:
+---------+-------+----------+---------------------------------------------+
|アドレス | Stats | ビット | 説明 |
+---------+-------+----------+---------------------------------------------+
| $7FFD | W ? | PPPPPPPP | PRG-ROM Page |
| $7FFE | W ? | CCCCCCCC | CHR-RAM Page (下位4K) |
| $7FFF | W ? | cccccccc | CHR-RAM Page (上位4K) |
| $8000 | W ? | PPPPPPPP | PRG-ROM Page |
| ... | | | |
| $FFFF | | | NOTE: $7FFE and $7FFF within this range |
| | | | are described above, and do not |
| | | | control PRG-ROM. |
| | | | 注:この範囲内の$7FFEと$7FFFは上に説明され、 |
| | | | PRG-ROMを制御しない。 |
+---------+-------+----------+---------------------------------------------+
??) American Video Entertainment(MB-91J)
このマッパは実際の数をまだ与えられなければならないが、Marat FayzullinのiNES
エミュレータの将来のバージョンとして最も恐らくある、更新される。
このマッパは32KのPRG-ROMと8KのCHR-RAMバンク切り替えをサポートする。 切り替
えのための実際のアドレスは奇妙であり線形ではない。 私が与えられた情報から、
切り替えのための有効なアドレスは次であるように思える:
$xy00-$xyFF 'x' can be: $1,4,5
$xy00-$xyFF 'y' can be: $1,3,5,7,9,B,D,E,F
$xy00-$xyFF
書かれたデータの形式は:
+----------+-------------------------------------------------+
| Bits | 説明 |
+----------+-------------------------------------------------+
| ----PCCC | P = PRG-ROM Page |
| | C = CHR-RAM Page |
+----------+-------------------------------------------------+
このマッパはかなり狂気で、アドレスについて恐らく誤解している。 噂はそれがあ
る、アドレスの「x」ニブルは同様に$0である、しかし、これは、ページ0を絶滅状
態にするように思える:したがって、それを病弱者と考えている。
Fayzullin氏がそれに関して何か言うのを待とう。
+----+--------------+
| 11 | サウンド |
+----+--------------+
NESの中で最も面白い面の1つはサウンドサポートであり、PCMレジスタ以外は真のア
ナログである。
完全なサウンド定数は、次のように思える:
111860.78 (e.g. 3579545/32)
これはセガジェネシス(えっ、面白い)内のTI 76486 PSGサウンドプロセッサ中で使
われるサウンド定数から得られた。
矩形波と三角波のチャンネルのために、1つの公式をNESのサウンドの正確な再生を
提供するために使用できる:
P = 111860.78 / (CHx + 1)
「P」が実際の演奏データであり、CHxが演奏チャンネルとする。 チャンネル公式は
下記である:
CH1 = $4002 + ($4003 & 7) * 256 (矩形波 #1)
CH2 = $4006 + ($4007 & 7) * 256 (矩形波 #2)
CH3 = $400A + ($400B & 7) * 256 (三角波)
ここで$400x値はそのレジスタに書かれた実際の値である。
PCMチャンネルのために、実装の2つの方法がある:DMAとPCMボリュームポート
($4011)によって。
サンプルは$4011へ1バイトずつ送られ、結果として全く聞こえる。 しかし、大部分
がDMA転送アプローチを使う一方、少数のだけのゲームはこの方法を使うように思え
る。
いかなる情報も評価される。
+----+----------------------+
| 12 | .NESファイル形式 |
+----+----------------------+
これはMarat Fayzullin(iNESの著者)によって作成された.NESファイル形式である。
これは16以上のiNESマッパをサポートするより新しい形式である。
+--------+------+------------------------------------------------------+
| Offset |サイズ| 内容 |
+--------+------+------------------------------------------------------+
| 0 | 3 | 'NES' |
| 3 | 1 | $1A (Control-Z) |
| 4 | 1 | 16K PRG-ROMバンクの数 |
| 5 | 1 | 8K CHR-RAMバンクの数 |
| 6 | 1 | ROM制御バイト #1 |
| | | %00000000 |
| | | +-++|||+- 0=水平ミラーリング |
| | | | ||| 1=垂直ミラーリング |
| | | | ||+-- 1=WRAM located at $6000-7FFF |
| | | | |+--- 1=512-byte trainer present |
| | | | +---- 1=Four-screen VRAM layout |
| | | | |
| | | +------ iNES Mapper番号 (下位4ビット) |
| 7 | 1 | ROM制御バイト #2 |
| | | %00000000 |
| | | +-++ |
| | | +------ iNES Mapper番号 (上位4ビット) |
| | | |
| 8-15 | 9 | [Reserved for expansion, should be 0] |
| 16-.. | | PRG-ROMバンク (in ascending order). A trainer pre- |
| | | cedes the firstバンク, if a trainer exists. |
| ..-EOF | | CHR-RAMバンク (in ascending order). |
+--------+------+------------------------------------------------------+
それに異なる実装があるので、以前に言及された512バイトトレーナは面白い、依存
すること、それに際してiNESマッパはカートリッジで使われる。 MMCに依存したト
レーナに関してより詳細に関しては、セクション#10を参照する。
+----+-------------------------------------------------+
| 13 | Famicom Disk System Format (.DKA/.DKB/.500) |
+----+-------------------------------------------------+
これはFamicomディスクシステムイメージのためのファイル形式である; それらをサ
ポートするこの時のただ一つのエミュレータはPasowing(エミュレータである)であ
る、これらのそのイメージは、離れて基づかれる。 .DKA/.DKB(ディスクA面とディ
スクB面)ファイルのための形式は、多少非公式の(示されたとともに)。 .DKAと.DKB
ファイルのサイズは64K(65536バイト)である。 ファイルの形式は次のとおりであ
る:
+--------+------+------------------------------------------------------+
| offset |サイズ| 内容 |
+--------+------+------------------------------------------------------+
| [IMAGE HEADER] |
| |
| 0 | 1 | [Unknown] |
| 1 | 3 | Disk ID |
| 6 | 1 | Disk # |
| 38 | 1 | Disk # (???) |
| 63 | 1 | Amount of data blocks |
| |
| [DATA BLOCK HEADER] |
| |
| 64 | 1 | $03 |
| 65 | 1 | Block # |
| 66 | 1 | ??? |
| 67 | 8 | Name |
| 75 | 2 | Destination |
| 77 | 2 | データサイズ |
| 79 | 1 | データタイプ |
| | | +---+---+ |
| | | | |
| | | +------ $00 = PRG-RAM |
| | | $01 = CHR-RAM |
| | | $02 = ネームテーブルデータ |
| 79-.. | | データ |
| | | |
| ..-EOF | | Repeat loading DATA BLOCKS HEADERS as shown above; |
| | | continue loading until EOF is reached. |
+--------+------+------------------------------------------------------+
+----+----------------------------+
| 14 | エミュレータ著者への注 |
+----+----------------------------+
NESは6502(NMOS)CPUである。 噂されたような65C02(CMOS)CPUではない。
「悪い」(6502の命令セット中にない)オペコードを無視する; 利用可能な多くのROM
は悪いバックアップユニットまたはリーダにより、フォルトがある。 まわりに浮か
ぶ「Twinbee」と「Adventure of Lolo」ROMの中でこれに気づいた。
4スクリーンVRAM配置は、iNESマッパ#5(MMC5)だけではなく他のマッパ内に使われ
る。 iNESマッパ#15などの中で使用されるようにみえる。
注意:MMC!=iNESマッパ。
NESスクリーンがオフの時、プログラマはVBLが起こるのは待つ必要がない。 スクリ
ーンがオフの間、VBLに同期せずにコードは安全にVRAMを編集し、グラフィックスを
操作することができる(同期しない場合、スクリーンがオンである間、結果は全くう
んざりさせている)。 これはスーパーニンテンドーのように、ほとんどのコンソー
ルに当てはまる。
NES PAL/NTSC問題に関してより詳細には、次でMark KnibbのNES PAL/NTSC文書を自
由にチェックする:
http://nesdev.parodius.com/nesfreq.txt
私は間違っていた; Konami World 2 存在*する*、日本のKonamiによって1991年に作
られた。 カートリッジはKonami VRC2マッパを使う。 しかし、Marat Fayzullinの
「パンチアウト2」に関してなお不確実である。
Famicomディスクシステムに関する迅速なコメント(それらに注意する人のため):明
らかに、PRG-RAM(正しい、ROMではなくRAM)は範囲$6000-$DFFFに位置する。 ブート
ストラップイメージは$E000-$FFFFにロードされる(これは「トレーナ」と考えるこ
とができるが、技術的には異なる)。 FDSレジスタは、範囲$E000-$FFFFの中にある
ように思える。 IRQ/RESETとNMIのベクタは、第1のPRG-RAMデータブロックの終了か
ら取られる。 FDSについての疑問で私に電子メールを送らないこと:(所有している
けれど)それのことをあまり知らない。
+----+----------+
| 15 | 感謝 |
+----+----------+
この文書が今日の形になったのを支援した次の人々に感謝する。 アルファベット
順:
+--------------------+-----------------------------+
| Name/Pseudo | Email |
+--------------------+-----------------------------+
| Acey | d0p@sofi.ah.dk |
| Alex Krasivsky | bcat@lapkin.rosprint.ru |
| Avatar Z | swahlen@nfinity.com |
| Bloodlust Software | bldlust@parodius.com |
| Bluefoot | danmcc@injersey.com |
| CiXeL | |
| Chris Hickman | typhoonz@parodius.com |
| D | d@animal.blarg.net |
| Dan Boris | dan.boris@coat.com |
| Donald Moore | mindrape@goodnet.com |
| FanWen Yang | yangfanw@ms4.hinet.net |
| Johansson Morgan | MOJ@nerikes.se |
| Jon Merkel | jpm5974@omega.uta.edu |
| Kevin Horton | khorton@iquest.net |
| Loopy | loopy@itsnet.com |
| Marat Fayzullin | fms@freeflight.com |
| Mark Knibbs | markk@netcomuk.co.uk |
| Matthew Richey | mr6v@andrew.cmu.edu |
| Mike Perry | mj-perry@uiuc.edu |
| Neill Corlett | corlett@elwha.nrrc.ncsu.edu |
| Pat Mccomack | splat@primenet.com |
| Paul Robson | AutismUK@aol.com |
| Stumble | stumble@alpha.pulsar.net |
| Tony Young | KBAAA@aol.com |
| Vince Indriolo | indriolo@nm.picker.com |
+--------------------+-----------------------------+
+----+------------------+
| 16 | 著者について |
+----+------------------+
(通常新米から)私が受け取る最も一般的な質問の1つは「あなたは誰か、また、地獄
が行ったところで、来る、から? 名前を規則的に聞く、しかし彼らは単にあなたで
ある?」である。
私の名前はJeremy Chadwickで、Y0SHiまたはYoshiとしてより一般に知られている。
私は5'10"(175cm)、150-160ポンド、青い灰色目、そして専門的に切られた金髪-茶
色の髪の毛である。 私の写真は私のWWWページで利用可能である。
私は、オレゴンアメリカのオレゴン州Corvallisにに位置したUNIXシステム/ネット
ワーク/セキュリティ管理者である(しかし1998年前半にカリフォルニアのMountain
Viewへ引越する)。 私は現在エレクトロニックアーツ(英国)に勤務してPSXの研究開
発を行い、地元の製版店でグラフィックデザインとビニール配置を行っている。 さ
らにparodius.com(去年にわたってゆっくりコンソール指向の資料のためのインター
ネット上の最も有名なサイトになった)のための主要なシステム管理者である。
そうだった、の上で、その「1989年後半以来のとlatee 1988年以来の世界のまわり
のBBSesの上のネット。 1987年以来のコンピュータの、1994年以来コンソールのプ
ログラミングをしていた:すべてアセンブリ言語で。 94年の7月ごろコンソールプロ
グラミングに興味を持ち、1994年のクリスマスの数日後に私の有名なSNES文書をリ
リースした。
その時以来、次のような多数のプロジェクト/ゲームを研究した:
* qNES * TRaCER (Pascal and ASM)
* SNES Documentation * Hexad (coming soon)
そして、さらに、次のような、他のプロジェクト(1つの方法または別の方法で)に援
助した:
* VSMC * ESNES
* SNES96/97 * NESticle
* Genecyst * SNES9x
* A/NES * X-Char & X-Late
人生で最も大きな報酬の1つは、他の誰かが、それらに情報を与えることにより、ま
たはちょうどそれらに精神的支持を与えることによりゴールを達成するのをいつ助
けることができるかである。 誰かを助ける金銭をとらない; 時々、賞賛の言葉と前
向きなフィードバックをちょうどとる。 行うことをなお楽しんでいる間誰かにそう
いった助けるを与えることによってと人々に公平なことによって、あなたが実際に
あなた自身に関してよく感じることができることを知った。
「あなたはとても賢い神である。」「あなたが何を知っているか知ることができた
らいいのにと思う」「おい、数日間履歴書を借りてもいいか。」といった多くのコ
メントを受け取る。
私が何を知っているか重要ではない。 私が学ぶ意欲があるという事実は、私ができ
ること同じくらい重要である。 学びたいと思い、そうする能力がある人は、すべて
を知っていると主張し、BS(BSの中のBS、最も恐らく)がある人より非常にもっと価
値がある(ビジネス方法)。
下記の方法の1つで私と連絡をとることができる:
Email: yoshi@parodius.com
yoshi@dynamik.com
yoshi@usa.net
WWW: http://yoshi.parodius.com/
IRC: Y0SHi (EFNet)
Mail: Parodius Networking
c/o Jeremy Chadwick
2470 NW Rolling Green Dr. #29
Corvallis, OR 97330
USA
エミュレーション「シーン」に関するここの私のコメントは削除された:私の目で
は、シーンはない。
*****_EOF_