Copy Link
Add to Bookmark
Report

Nintendo Entertainment System Documentation v0.53 (japanese)

Nintendo's profile picture
Published in 
Famicom
 · 21 Jun 2020


  

+------------------------------------------------------+
| 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_


← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT