+---------------------------------------------+
| Nintendo Entertainment System Documentation |
| |
| Version: 2.00 |
+---------------------------------------------+
日本語訳バージョン Translated by KZ-S
+------+
| 目次 |
+------+
1. 導入
A. 断り書き
B. なぜ?
C. 任務
D. 献辞
E. 謝辞
2. 略語
A. 内部
B. ハードウェア
3. CPU
A. 一般情報
B. メモリマップ
C. 割り込み
D. NESの特徴的仕様
E. メモ
4. PPU
A. 一般情報
B. PPUマップ
C. ネームテーブル
D. パターンテーブル
E. 属性テーブル
F. パレット
G. ネームテーブルのミラーリング
H. パレットのミラーリング
I. 背景スクロール
J. スプライトの重ね合わせ
K. スプライトとSPR-RAM
L. スプライト#0ヒットフラグ
M. 水平・垂直Blank
N. $2005/2006マジック
O. VRAM 読込/書き込み
P. メモ
5. pAPU
6. ジョイパッド, paddles, 拡張ポート
A. 一般情報
B. 光線銃
C. 4人対戦用デバイス
D. Paddles
E. Power Pad
F. ロボット
G. Signatures
H. 拡張ポート
I. メモ
7. マッパー
8. レジスタ
9. ファイルフォーマット
A. iNES形式 (.NES)
10. NESプログラミング
A. 一般情報
B. CPU
C. PPU
11. エミュレーション
A. 一般情報
B. CPU
C. PPU
D. APU
12. 参考文献
A. CPU
B. PPU
C. APU
D. マッパー
E. メーリングリスト
F. WWWサイト
G. ハードウェア情報
+---------+
| 1. 導入 |
+---------+
A. 断り書き
-------------
I am in no way held responsible for the results of this information.
This is public-domain information, and should not be used for commercial
purposes. If you wish to use this document for commercial purposes,
please contact me prior to development, so that I may discuss the outline
of your project with you. I am not trying to hinder anyone financially:
if you wish to do real Nintendo Entertainment System development, con-
tacting either Nintendo of America or Nintendo Company, Ltd. would be
wise. Their addresses are listed here:
Nintendo of America Nintendo Company, Ltd.
P.O. Box 957 60 Fukuine
Redmond, WA 98073 Kamitakamatsu-cho,
USA Higashiyama-ku,
Koyoto 602, Japan
All titles of cartridges and console systems are registered trademarks
of their respective owners. (I just don't deem it necessary to list
every single one by hand).
B. なぜ?
-----------
At the time this document was created, there was only one piece of lit-
erature covering the internals to the NES: Marat Fayzullin's documen-
tation, otherwise known as "NES.DOC".
While Fayzullin's documentation was lacking in many areas, it provided a
strong base for the basics, and in itself truly stated how complex the
little grey box was.
I took the opportunity to expand on "NES.DOC," basing other people's
findings, as well as my own, on experience; experience which has helped
make this document what it has become today. The beginning stages of this
document looked almost like a replica of Fayzullin's documentation, with
both minor and severe changes. Marat Fayzullin himself later picked up a
copy of my documentation, and later began referring people to it.
Keep in mind, without Marat's "NES.DOC" document, I would have never had
any incentive to write this one.
C. 任務
----------
The goal of this document is simplistic: to provide accurate and up-to-
date information regarding the Nintendo Entertainment System, and it's
Famicom counterpart.
D. 献辞
---------
このドキュメントをAlex Krasivskyに捧げたい。
Alexは素晴らしい友人であり、and in my eyes,
エミュレーションというボールを回転させた。
良いときも悪いときも、Alexはそこにいた。
スパシーボ, Alex; umnyj Russki...
E. 謝辞
---------
I'd like to take the time and thank all the people who helped make this
document what it is today. I couldn't have done it without all of you.
Alex Krasivsky - bcat@lapkin.rosprint.ru
Andrew Davie
Avatar Z - swahlen@nfinity.com
Barubary - barubary@mailexcite.com
Bluefoot - danmcc@injersey.com
CiXeL
Chi-Wen Yang - yangfanw@ms4.hinet.net
Chris Hickman - typhoonz@parodius.com
D - slf05@cc.usu.edu
Dan Boris - dan.boris@coat.com
David de Regt - akilla@earthlink.net
Donald Moore - moore@futureone.com
Fredrik Olsson - flubba@hem2.passagen.se
Icer Addis - bldlust@maelstrom.net
Jon Merkel - jpm5974@omega.uta.edu
Kevin Horton - khorton@iquest.net
Loopy - zxcvzxcv@netzero.net
Marat Fayzullin - fms@cs.umd.edu
Mark Knibbs - mark_k@iname.com
Martin Nielsen - mnielsen@get2net.dk
Matt Conte - itsbroke@classicgaming.com
Matthew Richey - mr6v@andrew.cmu.edu
Memblers - 5010.0951@tcon.net
MiKael Iushin - acc@tulatelecom.ru
Mike Perry - mj-perry@uiuc.edu
Morgan Johansson - morgan.johansson@mbox301.swipnet.se
Neill Corlett - corlett@elwha.nrrc.ncsu.edu
Pat Mccomack - splat@primenet.com
Patrik Alexandersson - patrikus@hem2.passagen.se
Paul Robson - AutismUK@aol.com
Ryan Auge - rauge@hay.net
Stumble - stumble@alpha.pulsar.net
Tennessee Carmel-Veilleux - veilleux@ameth.org
Thomas Steen - Thomas.Steen@no.jotankers.com
Tony Young - KBAAA@aol.com
Vince Indriolo - indriolo@nm.picker.com
\FireBug\ - lavos999@aol.com
Special thanks goes out to Stumble, for providing a myriad of infor-
mation over IRC, while avoiding sleep to do so.
+---------+
| 2. 略語 |
+---------+
A. 内部
---------
CPU - 中央演算処理装置: 自明。NESはスタンダード6502(NMOS)を使用。
PPU - 画像処理装置: グラフィック、スプライト、他の映像向けの機能を
制御する。
pAPU - 疑似オーディオ処理装置: CPUに基づく。
4つのアナログチャンネルと1つのデジタルチャンネルの計5チャンネルを
通して波形を生成する。
オーディオプロセスの為のICは物理的に存在せず、
NES内部での生成もまた無い。
MMC - マルチメモリコントローラー: マイクロコントローラーは6502の
64Kバイト限界を超えてメモリにアクセスするために用いられる。
MMCは拡張CHR-ROMにアクセスすることや、強制IRQなどの"特別な効果"や
他のことをも可能にする。
VRAM - ビデオRAM: PPU内部に存在するRAM。
NESには16kビットのVRAMが組み込まれている。
SPR-RAM - スプライトRAM: スプライトのために使われる256バイトのRAM。
VRAMの一部でもROMの一部でもないが、PPUに位置する。
PRG-ROM - プログラムROM: メモリ中の実際のプログラムコード領域。
MMCを通して実際のコード領域に拡張のコード領域を書いて交換する
こともできる。
PRG-RAM - プログラムRAM: RAMであること除いてPRG-ROMと同意語。
CHR-ROM - キャラクタROM: MMCを通して交換したり、電源ONシーケンスの間に
VROM - CHR-ROMと同意語
SRAM - セーブRAM: "Crystalis"やFFシリーズや"ゼルダの伝説"などのRPGで
一般的に使われるRAM。
WRAM - SRAMと同意語
DMC - Delta Modulation Channel: デジタルデータを扱う、APUのチャンネル。
一般的にPCMチャンネルに当てはまる。
EX-RAM - 拡張RAM: VRAMの能力を拡張することを可能にする、
任天堂のMMC5に搭載されているメモリ。
B. ハードウェア
-----------------
NES - 任天堂エンターテイメントシステム: 自明。
Dandy - ファミコンと同意語(ハードウェアに関して)
Famicom - NESと同意語
(ただしRAW--DMCデジタル音声の録音再生の方法--をサポートしていない)
FDS - ファミコンディスクシステム: ゲーム用の3インチ両面フロッピーの使用を
サポートした、ファミコンの上に載せる装置。
+--------+
| 3. CPU |
+--------+
A. 一般情報
-------------
NESはRicoh設計・生産のカスタムNMOS 6502 CPUを使用する。
それは主に音楽関連のカスタムである。
NTSCではNESは1.7897725MHzで動作し、PALでは1.773447MHzで動作する。
B. メモリマップ
-----------------
+---------+-------+-------+-----------------------+
|アドレス |サイズ |フラグ | 解説 |
+---------+-------+-------+-----------------------+
| $0000 | $800 | | RAM |
| $0800 | $800 | M | RAM |
| $1000 | $800 | M | RAM |
| $1800 | $800 | M | RAM |
| $2000 | 8 | | レジスタ |
| $2008 | $1FF8 | R | レジスタ |
| $4000 | $20 | | レジスタ |
| $4020 | $1FDF | | 拡張ROM |
| $6000 | $2000 | | SRAM |
| $8000 | $4000 | | PRG-ROM |
| $C000 | $4000 | | PRG-ROM |
+---------+-------+-------+-----------------------+
フラグ符号解説: M = $0000のミラー
R = $2000-2008の8バイトごとのミラー
(例 $2008=$2000, $2018=$2000,...)
C. 割り込み
-------------
6502にはIRQ/BRK、NMI、RESETの3つの割り込みが存在する。
それぞれの割り込みはベクタを持っている。
ベクタは、それらの割り込みが発生したときにジャンプする場所を
示した16ビットアドレスである。
IRQ/BRKは次の2つの状況で発生する。
ソフトウェアIRQ:ソフトウェアでBRK命令が実行されたとき
ハードウェアIRQ:IRQラインを経由してハードウェアIRQが実行されたとき
RESETは電源投入時に発生する。ROMがメモリに読み込まれ、6502はRESETベクタの
アドレスにジャンプする。
RESETではレジスタの変更やメモリのクリアは行われない。
これらは電源投入時にのみ行われることである。
NMIはNon-Maskable Interrupt(マスク不能割り込み)を意味し、
リフレッシュ(VBlank)ごとに発生する。
リフレッシュはPAL/NTSCによって異なった間隔で発生する。
NMIはNTSCでは1秒間に60回、PALでは50回実行される。
6502における割り込み遅延は7サイクルである。
これは割り込みに入ると出るのに7サイクルかかることを意味する。
ほとんどの割り込みはRTI命令を使用して戻るべきである。
スクウェアの”ファイナルファンタジー1”などの幾つかのカートリッジでは
この方法を使わない。
これらのカートリッジでは、スタックを手動で操作しRTSでリターンするという
非常に奇妙な方法で割り込みからリターンする。
この方法は技術的には有効であるが、道義的には避けるべきである。
前述の割り込みはROM内に次のベクタアドレスを持つ。
$FFFA = NMI
$FFFC = RESET
$FFFE = IRQ/BRK
割り込み優先順位は次の通りである
Highest = RESET
NMI
Lowest = IRQ/BRK
D. NESの特徴的仕様
--------------------
NESの6502は10進法モードのサポートを含んでいない。
CLDとSEDの二つの命令は普通に機能するが、しかしPのビット'd'は
ADCやSBCでは使われない。
電源投入時やリセット時の'd'の状態が不明なため、
コード実行の前にCLDを行うべきである。
オーディオレジスタはCPU内部に位置している。
全ての波形生成はCPU内部で行われるのである。
E. メモ
---------
2つの分かれた16K PRG-ROMに注意してください。
それらは恐らく順序正しいが、カートリッジのサイズによって別々の役割を果たす。
いくつかのゲームは1つの16KのバンクのPRG-ROMのみを保持し、
$8000ではなく$C000に読み込まれる。
ほとんどのゲームは$8000にロードされPRG-ROM空間を32K使用する。
PRG-ROM空間全体を使う最初のゲームは、スーパーマリオブラザーズである。
しかしながら、PRG-ROMの1つの16Kのバンクを越えるゲームはすべて、
同様に$8000にロードされる。
これらのゲームは、PRG-ROMやCHR-ROMを切り替えるためにメモリマッパを使用する。
BRKに遭遇したとき、NESの6502はビット'b'をセットすると共に
CPUステータスフラグをスタックにプッシュする。
IRQやNMIの時はビット'b'をクリアすると共にスタックにプッシュする。
これはハードウェアIRQ(IRQ)とソフトウェアIRQ(BRK)が同じベクタを共有している
ために行われる。
例えば、次のコードにより2つを区別することが出来る。
C134: PLA ; Copy CPU status flag
C135: PHA ; Return status flag to stack
C136: AND #$10 ; Check D4 ('b' CPU bit)
C138: BNE is_BRK_opcode ; If set then it is a software IRQ (BRK)
NMI内部でBRKを実行すると、プッシュされたビット'b'がセットされるという
結果になるだろう。
6502はオペコード$6C(間接絶対ジャンプ)にバグがある。
CPUは低位バイトが$FFである時に有効なアドレスを正確に算出しない。
C100: 4F
C1FF: 00
C200: 23
..
D000: 6C FF C1 - JMP ($C1FF)
論理的には、これは$2300にジャンプするはずである。
しかしながら事実によると、アドレスの高位バイトはページを越えて増加*できず*、
これは実際には$4F00にジャンプするであろう。
インデックス装飾間接アドレッシングモードにおいては、
ページをまたがる事が出来*ない*ことに注意するべきである。
ゼロページの制限のため、すべてのインデックス装飾間接リード/ライトは
有効なアドレスにするために計算後、論理演算AND $FFを行う必要がある。
例:
C000: LDX #3 ; Reads 間接アドレス from $0002+$0003,
C002: LDA ($FF,X) ; not $0102+$0103.
次へ