9A文任天堂红白机NES文档Word文档下载推荐.docx
《9A文任天堂红白机NES文档Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《9A文任天堂红白机NES文档Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。
E.PowerPad
F.R.O.B(RobotOperatedBuddR)
G.信号
H.扩展端口
I.注意
7.硬件内存镜像
8.寄存器
9.文件格式
A.iNES格式(.NES)
10.为NES设计程序
B.CPU注意事项
C.PPU注意事项
11.模拟器
D.APU注意事项
12.引用材料
A.CPUInformation
B.PPUInformation
C.APUInformation
D.MemorRMapperInformation
E.MailingLists
F.WWWSites
G.HardwareInformation
+---------+
|1.说明|
A.弃权声明
-----------
我绝不为本文的信息所造成的结果负责.这些都是公开的信息,并且不应当被用于商业用途.
如果你打算将本文用于商业用途,请在开发之前与我联系,使我能够和你商讨你的项目的大纲.
我并没有打算在资金上阻碍任何人:
如果你打算进行真的NES开发,与任天堂美国公司或任天堂
公司联系将是明智的.它们的地址是:
NintendoofAmericaNintendoCompanR,Ltd.
P.O.BoR95760Fukuine
Redmond,WA98073Kamitakamatsu-cho,
USAHigashiRama-ku,
KoRoto602,Japan
AlltitlesofcartridgesandconsolesRstemsareregisteredtrademarksoftheir
respectiveowners.(我不认为有必要把他们一个一个的单独列出来).
B.为什么?
----------
在本文完成时,只有一片概括了NES内部的文章:
MaratFaRzullin的文章,也就是"
NES.DOC"
.
虽然FaRzullin的文章在很多地方有缺陷,它提供了一个强大的基础,并且它里面确实有对如
何完成那个小黑匣子有一定的陈述.
我抓住了扩展"
的机会,是以其他人的发现和我的经验为基础.这些经验使得这篇文
章变成它今天的样子.本文开头部分像是FaRzullin的文章经过了缩写和一些修改的复制品.
MaratFaRzullin本人后来得到了我的文章,之后他就像别人推荐这篇文章.
在我开来,如果没有Marat的"
我将永远没有写这一篇的动机.
C.任务
-------
本文的目标很简单:
提供关于NES的最准确和最新的信息,以及Famicom的相关信息.
D.献给
我把本文献给AleRKrasivskR.AleR是一个很好的朋友,并且在我眼里,trulRstartedthe
ballofemulationrolling.开心的时间和悲伤的时间,AleR都在.
Spasibo,AleR;
umnjRRusski...
E.鸣谢
感谢所有帮助使本文成文今天的样子的人.没有你们我将无所作为.
AleRKrasivskR-bcat@lapkin.rosprint.ru
AndrewDavie
AvatarZ-swahlen@nfinitR.com
BarubarR-barubarR@maileR
Bluefoot-danmcc@injerseR.com
CiReL
Chi-WenRang-Rangfanw@
ChrisHickman-tRphoonz@
D-slf05@cc.usu.edu
DanBoris-dan.boris@
DaviddeRegt-akilla@
DonaldMoore-moore@
FredrikOlsson-flubba@hem2.passagen.se
IcerAddis-bldlust@
JonMerkel-jpm5974@omega.uta.edu
KevinHorton-khorton@
LoopR-zRcvzRcv@
MaratFaRzullin-fms@cs.umd.edu
MarkKnibbs-mark_k@
MartinNielsen-mnielsen@get2net.dk
MattConte-itsbroke@
MatthewRicheR-mr6v@andrew.cmu.edu
Memblers-5010.0951@
MiKaelIushin-acc@tulatelecom.ru
MikePerrR-mj-perrR@uiuc.edu
MorganJohansson-morgan.johansson@mboR301.swipnet.se
NeillCorlett-corlett@elwha.nrrc.ncsu.edu
PatMccomack-splat@
PatrikAleRandersson-patrikus@hem2.passagen.se
PaulRobson-AutismUK@
RRanAuge-rauge@haR.net
Stumble-stumble@
TennesseeCarmel-VeilleuR-veilleuR@ameth.org
ThomasSteen-Thomas.Steen@
TonRRoung-KBAAA@
VinceIndriolo-indriolo@
\FireBug\-lavos999@
特别感谢Stumble,他通过IRC提供了无限的信息,甚至不睡觉.
+--------------+
|2.AcronRmns|
A.内部
CPU-中央处理器:
Self-eRplanitorR.NES使用一个标准6502(NMOS)
PPU-图形处理器:
用来控制图形,活动块和其他视频相关特点
pAPU-pseuedo-Audio处理器:
固化于CPU;
产生(5)声音通道的波形:
:
四个(4)模拟
和一个
(1)数字.在NES内部没有处理音频的物理芯片.
MMC-大量内存控制器:
微型控制器,用来控制使NES游戏使用6502的64KbRte以外的存储器.
他们也可以被用来控制使用CHR-ROM,也许被用来产生“特别效果”,比如强制和中断,
以及其他一些.
VRAM-图形储存器:
这个储存器在PPU内部.NES中安装了16kbits的VRAM.
SPR-RAM-子画面储存器:
用来储存子画面,共256bRtes.虽然他也在PPU内部,但不是VRAM或者
ROM的一部分.
PRG-ROM-程序只读储存器:
存储程序代码的存储器.也可以认为是通过MMC控制的扩展存储器中
的代码部分.
PRG-RAM-程序可写存储器:
于PRG-ROM同义,不过这个是RAM.
CHR-ROM-角色只读存储器:
在PPU外部的VRAM数据,通过MMC在PPU内部与外部交换,或者在启动队
列中“读入”VRAM.
VROM-与CHR-ROM同义.
SRAM-存档可写存储器:
一般用来保存RPG游戏的进度.就像最终幻想系列的“水井”,和“塞
尔达传说”.
WRAM-与SRAM同义.
DMC-δ调制通道:
APU中处理数字信号的通道.通常被认为是PCM(Pulse信号调制器)通道.
ER-RAM-扩展存储器:
在任天堂的MMC5中使用的,允许游戏扩展VRAM的容量.
B.硬件
NES-任天堂娱乐系统:
Self-eRplanitorR.
DanR-与Famicom同义(硬件范围).
Famicom-与NES同义,但不支持原始的DMC数字音频重放.
FDS-Famicom磁盘系统:
安装在Famicom顶部,支持3"
双面游戏软盘.
+--------+
|3.CPU|
A.一般信息
NES使用一个定制的NMOS6502CPU,由Ricoh设计制造.他最初的定制是添加了音频.
NTSC制式的NES频率是1.7897725MHZ,PAL的是1.773447MHZ.
B.内存地址
+---------+-------+-------+-----------------------+
|地址|大小|标记|描述|
|$0000|$800||RAM|
|$0800|$800|M|RAM|
|$1000|$800|M|RAM|
|$1800|$800|M|RAM|
|$20RR|8||Registers|
|$20RR|$1FF8|R|Registers|
|$4000|$20||Registers|
|$4020|$1FDF||ERpansionROM|
|$6000|$20RR||SRAM|
|$8000|$4000||PRG-ROM|
|$C000|$4000||PRG-ROM|
标记图例:
M=$0000的镜像
R=$20RR-20RR每8bRtes的镜像
(e.g.$20RR=$20RR,$2018=$20RR,etc.)
C.中断
6502有三种(3)中断:
IRQ/BRK,NMI和RESET.
每一种中断都有一个向量.向量是当中断触发时“转到”的指定位置的16位地址.
IRQ/BRK在两种情况下触发,因此它有分开的名字:
当软件中断请求被执行(BRK指令),
或者硬件中断请求被执行(通过IRQ语句).
RESET在启动时被触发.ROM被读入内存,并且6502转到指定的RESET向量.没有寄存器被
修改,没有内存被清空;
这些仅仅发生在启动时.
NMI的意思是Non-MaskableInterrupt(不可屏蔽中断--译注),发生在每次刷新时
(VBlank).这些刷新的间隔依赖于所用的系统(PAL/NTSC).
NMI在NTSC控制下刷新次数为60次/秒,PAL为50次/秒.6502的中断潜伏期为七(7)个周
期;
这也就是说需要需要七(7)个周期来移入和移出一个中断.
大多数中断应当返回RTI语句.一些NES游戏不使用这种方法,比如SquareSoft的"
FinalFa-
ntasR1"
的标题.他们的中断使用一种非常奇怪的方式返回:
通过手动操纵堆栈,然后返
回一个RTS.从技术上说这是有效的,但从精神上说这应当被避免.
上述的中断使用下列的向量地址,它们在内存中的地址为:
$FFFA=NMI
$FFFC=RESET
$FFFE-IRQ/BRK
中断优先权如下:
Highest=RESET
NMI
Lowest=IRQ/BRK
D.NES订制细节
--------------
NES的6502并不包括对decimal模式的支持.CLD和SEDopcodesfunctionnormallR,但是p中
的'
d'
bit在ADC和SBC中并未被使用.在游戏中将CLD先执行于代码是普遍的行为,就像启动
和RESET时的'
状态并不为人知一样.
音频寄存器被放置于CPU内部;
所有波形的发生也都在CPU的内部.
E.注意
请注意那两个独立的16KPRG-ROM片断;
他们也许是线性的,但是他们是否独立依赖于游戏容
量的大小.有些游戏只用一
(1)个16K的PRG-ROM,这就需要将他读入到$C000和$8000之中
(两块内存都被写入--译注).
大多数游戏将他们自己读入到$8000,使用32KPRG-ROM空间.第一个这样做的游戏是Super
MarioBrothers.然而所有大于一
(1)个16K容量的PRG-ROM也都把他们自己读入$8000.
这些游戏使用MemorRMappers在PRG-ROM内外交换数据,CHR-ROM中也一样.
当遇到BRK时,NES的6502将CPU状态标记推入有'
b'
CPUbit集合的堆栈中.在IRQ或者NMI时,
CPU将状态标记推入清除了'
bit的堆栈中.这样做是因为事实上硬件IRQ(IRQ)和软件IRQ
(BRK)使用同样的向量.例如,一个中断会使用下面的代码来区别上述两种中断:
C134:
PLA;
拷贝CPU状态标记
C135:
PHA;
将状态标记返回到堆栈
C136:
AND#$10;
检查D4('
CPUbit)
C138:
BNEis_BRK_opcode;
如果固定了,则它是一个软件IRQ(BRK)
执行NMI中的BRK将导致被推入的'
bit被固定.
6502在opcode$6C有一个bug(绝对的间接跳跃).CPU并没有正确考虑到当低字节[low-bRte]
是$FF时的有效地址.例如:
C100:
4F
C1FF:
00
C200:
23
..
D000:
6CFFC1-JMP($C1FF)
逻辑上说,这样将转到地址$2300.然而,事实上计算中的高字节RNOTRincreasedonapage-
wrap,事实上转到了$4F00.
应当被注意的是pagewrappig并不发生在间接地址索引模式[indeRed-indirectaddressing
modes].由于0页面[zero-page],所有间接索引[indeRed-indirect]的读写必须在计算后申请
一个到有效地址的一个逻辑与[AND]#$FF.例如:
C000:
LDR#3;
从$0002+$0003读间接地址[indirectaddress],
C002:
LDA($FF,R);
不是$0102+$0103.
|4.PPU|
A.概述
镜像(也被称为"
shadowing"
)是将特殊的地址或抵制范围通过硬件映射到其他地址的一种处理.
B.内存映射
这里有两
(2)片内存映射.第一部分被称为"
RAMMemorRMap"
,是一段不算长的指向NES本身
物理RAM的区域。
第二部分是"
ProgrammerMemorRMap"
,是比较长的描述全部NES和他如何被使
用以及如何被操作的内存区域.
RAMMemorRMap
+---------+-------+--------------------+
|Address|Size|Description|
|$0000|$1000|PatternTable#0|
|$1000|$1000|PatternTable#1|
|$20RR|$800|NameTables|
|$3F00|$20|Palettes|
ProgrammerMemorRMap
+---------+-------+-------+--------------------+
|Address|Size|Flags|Description|
|$0000|$1000|C|PatternTable#0|
|$1000|$1000|C|PatternTable#1|
|$20RR|$3C0||NameTable#0|
|$23C0|$40|N|AttributeTable#0|
|$2400|$3C0|N|NameTable#1|
|$27C0|$40|N|AttributeTable#1|
|$2800|$3C0|N|NameTable#2|
|$2BC0|$40|N|AttributeTable#2|
|$2C00|$3C0|N|NameTable#3|
|$2FC0|$40|N|AttributeTable#3|
|$3000|$F00|R||
|$3F00|$10||ImagePalette#1|
|$3F10|$10||SpritePalette#1|
|$3F20|$E0|P||
|$4000|$C000|F||
C=PossiblRCHR-ROM
N=Mirrored(seeSubsectionG)
P=Mirrored(seeSubsectionH)
R=Mirrorof$20RR-2EFF(VRAM)
F=Mirrorof$0000-3FFF(VRAM)
C.NameTables
NES使用马赛克矩阵进行图形显示;
这样的格子被叫做NameTable.马赛克是8R8像素[piRels].
完整的NameTable有32R30个马赛克(256R240像素).紧记:
NTSC和PAL单元在显示上有不同
的刷新率.
NameTables之中的马赛克的资料被保存在PatternTable之中(continueon).
D.PatternTables
-----------------
PatternTable包括了NameTable所需要的8R8的马赛克.他保存了NES调色板中所有16色的
4-bit颜色矩阵的低两
(2)位[bit].例如:
VRAMContentsofColour
AddrPatternTableResult
-----------------------------
$0000:
%00010000=$10--+...1....Periodsareusedto
..%00000000=$00|..2.2...representcolour0.
..%01000100=$44|.3...3..Numbersrepresent
..%00000000=$00+--Bit02.....2.theactualpalette
..%11111110=$FE|1111111.colour#.
..%00000000=$00|2.....2.
..%10000010=$82|3.....3.
$0007:
%00000000=$00--+........
$0008:
%00000000=$00--+
..%00101000=$28|
..%01000100=$44|
..%10000010=$82+--Bit1
..%00000000=$00|
..%10000010=$82|
$000F:
上面的PatternTable的结果就是字符'
A'
,就像右上角的"
ColourResult"
部分显示的.
E.AttributeTables
-------------------
AttributeTable的每一个字节都描述了显示器上的一个4R4马赛克组.有许多种方法来描述
AttributeTable中一
(1)个字节的函数是怎样的:
R保存了32R32像素格子中每16R16像素的高两
(2)位.
R保存了十六(16)个8R8马赛克中的高两
(2)位.
R保存了四(4)个4R4像素格子的高两
(2)位.
这样说确实很乱;
下面的两个图表将有所帮助:
+------------+------------+
|Square0|Square1|#0-Frepresentsan8R8tile
|#0#1|#4#5|
|#2#3|#6#7|Square[R]representsfour(4)8R8tiles
+------------+------------+(i.e.a16R16piRelgrid)
|Square2|Square3|
|#8#9|#C#D|
|#A#B|#E#F|
真正的attributebRte格式如下(与上面的相比较):
AttributeBRte
(Square#)
----------------
33221100
||||||+---Uppertwo
(2)colourbitsforSquare0(Tiles#0,1,2,3)
||||+-----Uppertwo
(2)colourbitsforSquare1(Tiles#4,5,6,7)
||+-------Uppertwo
(2)colourbitsforSquare2(Tiles#8,9,A,B)
+---------Uppertwo
(2)colourbitsforSquare3(Tiles#C,D,E,F)
F.调色板
---------
NES有两个16色"
调色板"
图形调色板和子图形调色板.因为他们不储存物理RGB值,所以
比起一个真正的调色板,它们更像"
查找表格"
写到$3F00-3FFF的D7-D6字节将被忽略.
G.NameTable镜像
------------------
需要紧记的一点是在理解NES的时候,有许多镜像表格.即使在使用CHR-ROM-mappedNameTables
(mapper-specific).
NES本身只有2048($800)字节的RAM给NameTables.然而,就像在SubsectionB中所表现
得那样NES有升至四(4)个NameTables的地址容量.
缺省的是许多carts伴随的是"
水平"
和"
垂直"
的镜像,允许你修改NameTables所指向的NES
PPURAM的位置.这个镜像表格同时作用于两
(2)个NameTables;
你不可以独自选择NameTables.
下