签到天数: 2168 天 [LV.Master]伴坛终老
|
楼主 |
发表于 2012-3-22 17:11:43
|
显示全部楼层
╋╋╋ 【.16.】NES 技术/模拟器/开发 FAQ╋╋╋
原文版本 1.4, 作者为 Chris Covell (chris_covell@yahoo.ca) 最后更新日期为 2002 年 1 月 18 日.
中文版版本 1.4.0.66, 翻译者为 Blue Potato (bspotato@yahoo.com.cn) 最后更新日期为 2004 年 7 月 17 日.
写作目的
本文的写作目的是为了回答对 NES 系统好奇的人们经常问到的关于 NES/Famicom 的技术、NES 模拟器和 NES 开发的问题. 本文不是 NES 的权威文档; 更恰当的说, 它是研究散布于互联网上的其他文档的出发点. 需要注意的是, 本文并不仅是对于陈旧技术的讨论. 我将我的观点引入一些有争议的问题. 如果你对此有疑问, 就自己写一篇缺乏生动和幽默的文档. 然后在 Microsoft 找一份工作, 你将会非常完美的适合这份工作. Nyuk Nyuk. :-)
你应当注意到了, 因为本文有我自己完成, 文中的语法和拼写都使用的是标准的加拿大英语 (standard Canadian English) . 所以, 如果你喜欢将 "colour" 写为 "color", 或者你喜欢将 "while" 写为 "whilst", 或者即便你习惯将 "spelled" 写为 "spelt", 忍受一下吧. 这只是我的方法.
--------------------------------------------------------------------------------
目录
基本问题
NES 使用什么 CPU?
NES 能同时显示多少中颜色?
NES 的分辨率是多少?
为什么 NES 会降速或闪烁?
内存镜像是如何工作的? 为什么有很多内存镜像?
什么是 NES 的停机芯片 (CIC), 它是如何工作的?
怎样翻译 NES 游戏?
所有 NES 游戏中最大的是哪个?
最小的 NES 游戏是什么?
怎样才能得到原型 (prototype) NES 卡带?
硬件
如何打开 NES 卡带?
能够禁止停机芯片吗?
NES 和 Famicom 兼容吗?
NES 和 Famicom 的硬件一样吗?
怎样在北美/欧洲使用日版 Famicom?
NES 和 SNES 兼容吗?
NES 和 Gameboy/GBC 兼容吗?
老式 (toaster) NES 和新式的顶部读取 NES 之间有什么区别吗?
Famicom 和 NES 的控制器通用吗?
SNES 和 NES 的控制器通用吗?
怎样从 NES 中获得 RGB 信号?
能让顶部读入的 NES 输出 A/V 信号吗?
NES 能够输出立体声或单独的声道吗?
什么是 Famicom 磁碟系统 (Disk System) ?
金手指 (Game Genie) 如何工作?
NES 中的电池可以持续多长时间?
可以在不清除掉 RAM 中存储信息的条件下更换电池吗?
NES 上的扩展接口是用来干什么的?
模拟
模拟是非法的吗?
Nesticle...
怎样才能拷贝/备份 NES 游戏?
怎样才能把 X 游戏拷贝到卡带上?
可以制作/购买通用型 NES 卡带吗?
我想做模拟器. 应当从那里入手呢?
¥?#181; a®3 £ee+, g0+ an¥ ROMz +?g¡v3 m3?
怎样才能把 .FDS 文件读入我的模拟器?
什么是 iNES 的文件头?
什么是 UNIF?
有 iNES < - > UNIF 转换程序吗?
什么是 .IPS 补丁? 怎样才能使用它?
什么是 NSFs?
如何分离 NSFs?
程序设计
NES 游戏用什么语言编写, C, BASIC 或者其他语言?
怎样才能开始编写 NES 程序?
How do the NAME table, ATTRIBUTE table, and PATTERN table all fit together?
How are NES graphics laid out?
How does palette mirroring work?
How does PPU mirroring work?
How does sprite 0 hit detection work?
What is VBlank and what is HBlank?
How many scanlines are in VBlank period?
What's up with $2005/2006?
How can I get a stable background in my demo?
Why is there graphics glitching when you change $2005 or $2006 mid-screen?
Is the NES palette RGB or what?
How do I get an accurate palette then?
What is the right register value for black in the palette?
What are the colour emphasis bits?
What is the monochrome mode in the NES?
What are bus conflicts?
Do I enable interrupts (CLI) in my demo?
How can I make music for my demo?
Why does my demo work in an emulator, but not on a real NES?
How can I test my demo on a real NES?
How does the NES produce sampled sounds? What bit size are they?
How does $4011 work?
Why does my demo's timing mess up when a DMC sample is playing?
What's better, writing to SPR-RAM directly, or using DMA?
Thank-Yous
基本问题
Top
NES 使用什么 CPU?
它的 CPU 是基于 6502 NMOS 系列的 8 位处理器. 由 Ricoh 制造, 名字是 RP2A03G. 它的指令集并不包括任何 CMOS 的 "STZ" 指令, 更重要的是, NES CPU 没有十进制工作模式. 你可以任意设置和清除十进制标志, 但是任何 NES 上的算法指令都将以基数为 16 来计算. 定制的 NES CPU 内建 5 条不同的音频通道.
NES 能同时显示多少中颜色?
一般来说, NES 可以显示 13 种不同的背景色, 和 12 种不同的活动块色 (挺拗口的, 原文是 "sprite colours" -- 译注), 总共每次同屏 25 色. 然而, 使用 PPU 欺骗技术 (PPU trickery), 可以一次显示 NES 的调色板中的全部 64 色. (如果你将颜色强调位 (Colour Emphasis bits) 像 PPU 欺骗技术一样使用, 我猜你会说你能一次同屏最大显示 512 色. 但是那需要将物体拉伸. 举例来说, 那像是调色板块之间的一些副本.) 总之, 就让我们认为一般来说最大颜色数目是 25 色, okay?
NES 的分辨率是多少?
NES 的分辨率 是 256x240. 许多年来, 人们都认为 NTSC NES 的分辨率低于 PAL NES, 于是许多模拟器只显示 256x224. 这对于许多显示屏或电视机是正确的, 最顶部和最低部各有 8 线被切掉了; 然而这是显示设备的机能, 不是 NES 所必需的. 在我的显示器上, 使用我的 NTSC NES, 我可以看到从第 8 到第 240 条扫描线 (有附加的 3 条) . 一般来说, NES 输出第 233-240 的全部扫描线 (曾经被认为是隐藏的) . 最顶部的 8 条依旧假设为是被隐藏的, 但不一定是. 例如, 当我的录像机录下 NES 的显示时, 先前的 4 条线就可见了. PAL NES 显示全部的 240 条扫描线, 不存在上述的问题. NTSC NES 依旧有些不明确.
最后一条是 (并非有意的双关语) (原文是 "The bottom line (no pun intended) is" -- 译注), 如果制作一个模拟器, 你应当提供是否显示顶部和底部的各 8 条扫描线的选项. 如果你写 NES 的 demo 或者游戏, 你应当假设玩家也许能够看到你放在屏幕最先和最后的那些行的东西.
为什么 NES 会降速或闪烁?
NES 并不是自动降速或闪烁. 事实上, 原因是游戏变得太复杂了, 过多的物体被引入到显示区域, 使用一帧的时间 (1/60 秒) 无法计算一帧的行为了. NES CPU 的速度大约是 1.79Mhz, 对于某些计算来说并不足够快. 事实上, 如果计算溢出到下一帧, 游戏时常会出些小故障或定住. 于是, 程序员会将游戏速度变慢以将连续的帧之间的计算分割.
闪烁一般是一条水平扫描线上有太多的 sprite 的结果. NES 能够在同一线上最大显示 8 个 sprite. 如果超出了, PPU 只是简单的不显示他们. 于是, 程序员就需要在显示一个个的 sprite 集合之间进行转换. 这是通过一个好用的算法 "OAM Cycling" 来处理. 由于使用了 OAM 算法, sprite 可能会闪烁 (比如许多 Konami 游戏), 或者以水波的效果取消 (一些游戏中) .
内存镜像是如何工作的? 为什么有很多内存镜像?
6502 CPU 只有 16 位地址总线. 这就意味着它每次只能访问 ROM 或 RAM 中最大 65535 字节. NES 被设计只能访问那么多 ROM 中的一半. 由于程序员想要有更复杂的游戏, 他们需要一种方法以将游戏大小扩展超过 32K ROM. 因而, 内存镜像就是将不同的程序代码块转换入 CPU 可访问的 32K ROM 的设备.
在增加地址空间后, 许多现代内存镜像确实增加了游戏的可用角色图形数目, 以及如何把它们连接起来. 第一个改变图形的镜像能够进行每次 8K 的转换. 然而, 后来的镜像允许游戏能够进行 CHR ROM 中更小部分的交换, 进行更多的背景动画. 另外, 许多游戏公司推出了他们自己的支持 IRQ 计时器的镜像, 允许 PPU 执行 trick. 一些镜像还有附加的音频芯片, 以增加游戏中的音乐复杂度 (只有 Famicom) .
于是, 简单得说, 内存镜像允许程序员突破 NES/Famicom 内在的限制.
什么是 NES 的停机芯片 (CIC), 它是如何工作的?
Nintendo 非常贪婪, 他们想以要求开发者在开发 NES 游戏前先获取受权的方式来获得最大利益. 为了使这种做法有效, 他们在 NES 游戏机中安装了一个芯片, 用这个芯片监测 NES 卡带中的另外一个类似芯片. 然后这两个芯片只见建立一个通讯协议. 如果没有这个协议, NES 游戏机将不会出现重启模式 (reset mode) . 因为只有 NES 出售这种停机芯片, 开发者除了选择从 Nintendo 购买这种芯片 (通过授权) 以外, 几乎没有其他的选择, 否则他们就需要找出禁止停机芯片工作的方法, 这就是大多数未被授权的开发者所作的. 同样存在区域性停机. 存在欧洲用的停机芯片, 也存在亚洲用的. 一般来说, 美国的 NES 游戏/系统与亚洲/欧洲的游戏/系统不兼容, 除非你禁止了停机芯片.
我不认为一般人真正了解 CIC 通讯协议的细节, 但是自从有办法永久禁止那个芯片, 我不再认为那些细节很重要了. 据我所知, 新生产的 NES 游戏机不再有停机芯片. Famicom 系统也没有停机芯片.
怎样翻译 NES 游戏?
哈. 我在这方面并不是专家, 但是现在问到了. 如果你进行翻译的语言使用同样的字母表, 那就没有任何问题. 如果你翻译的语言使用不同的字母表, 你需要建立自己的字库 (或者使用别人的) . 你应当非常熟悉源语言和目标语言, 并且将该游戏爆机, 以获得游戏中全部/尽可能多的文本. 第一步是搜索文本在 ROM 中的储存位置. 如果原文是日语, 你就需要自己按照文本/字符映射表进行查找. 如果原文是英语, 你应当使用相关字符搜索程序搜索文本, 如果他没有使用 ASCII 字符映射表的话. 如果你确定了游戏中的字符串储存的位置 (或者你确定了被使用文本压缩方案), 你就可以开始翻译文本了, 当然要保证不能覆盖游戏中的非文本部分.
也许你发现翻译后的文本的大小与原文不同. 这就意味着你将需要改变游戏中的文本指针 (也许现在就需要) 以映射到修改后的文本位置. 翻译是需要许多不同技术的任务. 多看一看互联网上有关翻译的指南.
所有 NES 游戏中最大的是哪个?
据我所知, NES 上最大的游戏是 Dragonquest 4 / Dragon Warrior 4. 他们的程序 ROM 大小是 1mb. 同样, 日版游戏 Metal Slader Glory 有 512K PRG 和 512K CHR ROM, 加起来也是 1mb. 一些盗版/未授权的 Famicom 游戏也非常大.
最小的 NES 游戏是什么?
虽然 iNES 镜像格式认为 16K PRG ROM 为最小的, 但是事实上有一些 8K 游戏, 比如 Galaxian. 对于 NES 游戏或 demo 的大小没有确切的最低限制, 但是为什么要把游戏做得那么小呢?
怎样才能得到原型 (prototype) NES 卡带?
事实上, 并不是你在寻找原型卡带; 而是他们在寻找你. 认真地说. 原型是非常罕见的, 只能在世界的某些地方找到. 如果你确实是在某些不知道的地方 (我不想给他起名字, 因为也许会冒犯一些人), 你可能无法在当地的跳蚤市场找到原型. 但是谁知道呢? 也许你能?
只需要去你当地的当铺, 旧货店, 跳蚤市场, 和 garage sales. 也许有一天你也会发现原型. 我也没有任何原型 NES 游戏, 除非你把我现在有的也算在内. 呵呵. :-)
--------------------------------------------------------------------------------
硬件
Top
如何打开 NES 卡带?
有一些方法可以打开. 如果你的卡带使用老式的扁头螺丝, 那么只需要一个螺丝刀, 拧开它. 然而, 大多数游戏卡带使用 3.8mm "Inverse Torx" 类型螺丝, 这类螺丝使用的螺丝刀并不容易找到. MCM Electronics (http://www.mcmelectronics.com/) 出售这种螺丝刀. 它的编号是 22-1145. MCM 同样出售多种 4.5mm 型号的螺丝刀 (22-1150), 可以用来打开 SNES, 等等. 注意, 不要让 MCM 的笨蛋在运输是抢劫了你!
还有其他的办法. 可以用一个热的烙铁 (要小心了!) 放在螺丝钉的顶部, 然后轻轻的拉开盒子. 这样做也许会通过螺丝钉融化塑料来打开塑料盒. 然后可以用一个小扁头螺丝代替以前的螺丝. 恩, 另外, 一个我很早以前使用的办法是用一个非常硬的缝衣针或者图钉, 然后用它们的末端通过对螺丝钉的一个凹槽施加压力来慢慢地松动螺丝钉.
最后, 其他的方法是使用你所有的力量来打开卡带 (或用一些坚固的工具) . 虽然要小心; 因为塑料片的碎片最终可能进入你的喉咙...我们需要有在标题上写上另外一个安全警告: "NINTENDO 杀死了我的儿子!!! 卡带撕裂了他的脖子!" 我们不希望这样做. ;-P
能够禁止停机芯片吗?
当然. 简单的方法是: 在 NES 电路板上 (只有老式 NES) 找到标有 "CIC" 的芯片, 然后切断 #4 针脚 (要清楚你再做什么), 然后把它接地 (同一块芯片的 11-15 号针脚也一样) .
一篇关于如何禁止停机芯片的完整文档是由 Mark Knibbs 所写, 可以在互联网上一些类似 nesdev.parodius.com 的地方找到.
NES 和 Famicom 兼容吗? 从任何目的和意图来说, 是的. 使用恰当的转接器, 可以在 NES 上玩 Famicom 的游戏, 也可以在 Famicom 上玩 NES 的游戏. 只需要记住 NES 用转接器有 72 针脚; 而 Famicom 用的是 60 针脚.
有些需要注意的是: 由于 Famicom 使用内建声音芯片, 所以游戏卡中的声音不通过 NES 传输. 同样, 如果转接器连接部分不是非常干净, 或者没有接好, 那么一些转接器将会抑制特定的扫描线或 IRQ 定时器周期. 最后, 如果你是用转接器在 Famicom 上玩 NES 游戏, 那么这样拼合起来的游戏机中的金手指也许不会工作. 金手指也许不适合转接器接口, 或者在游戏启动的时候有很难听的声音.
NES 和 Famicom 的硬件一样吗?
从软件的角度上说, 一样. 我不知道一个游戏如何检测自己是在美版系统还是在日版系统上运行的, 除非能够监测是否有麦克风或者在 2 号手柄上是否存在 Start 和 Select 按键. 即便这样, 新样式的 AV 输出 Famicom 使用与 NES 同样的可分离, 可互换的手柄.
从硬件的角度上说, 有一些小的差别. 在 Famicom (老式) 上, 控制器是不可分离的, 并且存在可以接第三个手柄或其他输入/输出设备的接口. 这个借口也可以作为扩展接口使用 (在 NES 游戏机底部可以发现) . 2 号手柄内置一个可调音量的麦克风, 而且没有 Start 和 Select 按键. 老式 Famicom 只能以 RF 射频方式连接电视. Famicom 没有停机芯片, 所以卡带只有 60 脚. 为了允许内置音频芯片对 Famicom 音频进行混音, 卡带接口也进行音频的输入和输出. NES 和 Famicom 有一致的关于样本声音的音频电路. NES 和 Famicom 都可以通过δ调制通道输出样本声音, 以及未经加工直接输出样本声音. 这就很清楚了!
新型号的 Famicom 使用与 NES 一样的手柄 (经过美化改进的) 以及一样的手柄接口. 就现在来说, 新型号的 Famicom 只有 AV 输出. 除了这些, 新型号的 Famicom (几乎) 完全兼容旧型号的 Famicom 所使用的设备.
怎样在北美/欧洲使用日版 Famicom?
这是个好问题, 但多少有些狡猾. 最重要的是, 不要把 NES 的变压器在 Famicom 上使用!!! NES 的变压器输出是 9v AC, 而 Famicom 需要的是 9v DC. 在一些地区, 你需要找到合适的变压器 (9/10v Dc, 850MA, Negative Tip 挺好) .
如果你用的是只有 RF 输出的老式 Famicom, 你需要找到一个有模拟调制的老式电视 (也许是 UHF), 或者对 Famicom 进行改造, 是它能直接输出音频/视频信号. 通过 RF 将 Famicom 接到一个试验电路, 然后就可以开始查找电视机里面它的信号了. 我发现有时 Famicom 信号在北美 3 频道和 4 频道之间; 有时在 UHF 频道. 你也可以这样做, 或者, 如果你擅长电子技术, 直接在 Famicom PCB (电路板) 上查找 (很弱的) A/V 信号.
新版的 Famicom 变得简单了. 你需要同样的 9v DC 变压器, 和一个 SNES/SFC 多 AV 输出线. 多 AV 输出线直接插在 AV Famicom 的后部.
NES 和 SNES 兼容吗?
几乎不兼容, 但不是绝对的. 为什么 Nintendo 不保证完全的兼容, 这对我来说依旧很神秘. (好的, 并不全是个秘密; 贪婪是原因之一.) 虽然 SNES 的 65816 处理器 (不管怎样说) 都向后兼容 6502 的软件, 但是 SNES 上的图形和声音处理硬件却不直接兼容. 虽然可以稍微修改小型 NES ROM 到可以在 SNES 上工作的 SMC 格式, 但是那需要通过对不同寄存器的写入进行手工修改. 不能将未修改的 NES 游戏运行在 SNES 上.
然而存在一种叫做 TriStar 或 Super 8 的适配器可以在 SNES 上运行 NES/Famicom 的游戏. 但是它只使用 SNES 作为电源, 控制器, 和视频合成器. NES/Famicom 的 CPU/PPU 位于 TriStar/Super 8 适配器的内部. 所以, 很不幸的是没有 NES 产生的 RGB 或 S-VHS 视频信号. :- (
NES 和 Gameboy/GBC 兼容吗?
不兼容. GB/GBC 使用 Zilog Z-80 型处理器, 不是 6502. 另外, 屏幕大小和调色板的细节都不一样. 有一个程序可以让容量小的 NES ROM 在 Gameboy 上运行, 但是这种程序的输出最多也就是极慢的速度以及很多漏洞. 一些 (比如 SMB DX, Ghosts & Goblins) NES 上游戏的官方 GBC 版本的代码是由游戏公司以可以在 Z-80 上运行的机器代码重新编写过的.
老式的 NES 和 新式的顶部读取 NES 之间有什么区别吗?
是的, 显著的区别是新式顶部读取的 NES 只有 RF 信号输出, 除非你改机器. 愚蠢的 Nintendo, 为什么这样做呢??? 顶部读取装置在读取游戏时比老式前部读取装置好很多, 因为链接器几乎经常与游戏进行着合适的联系. 要顶部读取的 NES 与 金手指相兼容并不容易, 因为金手指的电路板特别厚. Galoob 曾经提供一个来解决这个问题的外部适配器. 据我所知, 新式 NES 没有停机芯片. 最后, 与老式 NES 相比, 由于不恰当的分离, 顶部读取的 NES 的图象信号非常弱. 对此有一种解决办法, 如果没有这个办法, 正常情况下新式 NES 每 8 个像素都会有很弱的竖直条.
Famicom 和 NES 的控制器通用吗?
是的, 通用. 我曾经用方形 15 针控制器线将一个 NES 手柄接到我的 Famicom 上. 我还安装过一个可以****制器是接在 Player 1 还是 Player 2 上的开关. 可以在 Famicom 上使用 NES 的控制器是一个非常好的事情. 可以在互联网上的一些地方 (或者 nesdev.parodius.com) 找到关于控制器阵脚分布的文档.
SNES 和 NES 的控制器通用吗?
我曾经看到过关于怎样使 SNES 控制器能在 NES 上使用的文档. 其他的办法我不知道, 但是听起来是可行的. 在常去的地方找找吧.
怎样从 NES 中获得 RGB 信号?
不能. 绝对不可能. NES 从 PPU 产生合成视频信号, 没有其他的了. 确实有一些 NES 游戏机输出 RGB 信号, 但是仅限于以下三种: 1) Nintendo 用来截取游戏图片的游戏机, 2) Choice 10 街机, 以及 3) 法国版 NES 游戏机, 也许本身可以产生 RGB 信号, 也许不可以. 很遗憾.
能让顶部读入的 NES 输出 A/V 信号吗?
可以, 有一些文档写了应当如何做. 去类似 Game Station X 的网站. 这样的内部改造同样适用于只有 RF 输出的 Famicom.
NES 能够输出立体声或单独的声道吗?
是的, 可以. 你不能够将所有声道分离开; 但是, 全部 NES/Famicom 游戏机将 5 个通道分为 2 个 (CPU 上的针脚) . 从 CPU 的一个针脚产生两个方波通道, 另外一个针脚上产生三角波, 杂波 (noise), 和采样通道. 到网上试着找找相关信息, 或者直接去 我的网站, 那里有一个页面描述了如何从 NES 获得高质量的立体音频!
什么是 Famicom 磁碟系统 (Disk System) ?
那是一个 1986 年在日本发售的一个短命的外设. 它是个位于 Famicom 游戏机下面, 通过一个 RAM 卡带与 Famicom 相连的磁盘驱动器. 游戏保存在非标准 3 寸磁盘. 这个系统的优点在于磁盘很便宜, 它们利用了外接于 RAM 单元中的声音处理硬件, 于是玩家可以把游戏保存在磁盘中 (这是在使用用电池支持的便宜的 RAM 时代之前) . 这个系统的缺点有很多: 游戏的区域和大小有限制, 读入时间很长, 盗版行为很猖獗, 并且磁盘驱动器的带子 (belt) 损坏很快. 几年过去后, 内存镜像有所发展, 于是有更多的 Famicom 大游戏了. 于是, Nintendo 在 90 年代初默默的放弃了 FDS.
金手指 (Game Genie) 如何工作? 基本上, 金手指监视卡带接口的地址总线, 修改卡带接口的数据总线中那些它遇到的设定好的需要截取的数据. 在外行看来 (In layman's terms), 金手指用一些特定的值代替游戏中的某些值得行为依赖于一个特定的排斥代码 (proscrbied code) . 这使得金手指指能够暂时修改将在 NES CPU 中出现的值, 而不是永久性修改游戏本身. 金手指不像其他的可以将 RAM 中的某些特定区域锁定为特定的值得的作弊设备那样; 金手指修改从 ROM 输出的数据.
NES 中的电池可以持续多长时间? Nintendo 说是 5 年; 然而我的 1987 年的 Zelda 卡带现在还在, 而且使用的还是最初的电池, 记忆保存完好. 我认为电池使用时间依赖于卡带的用电量, 或者其他什么.
可以在不清除掉 RAM 中存储信息的条件下更换电池吗?
恩, 也许可以, 但是丢失资料的换电池方法却是更简单一些. 更换 NES 中的电池并不困难; 需要首先切断原来电池的连接, 然后换上一块新的, 最后把新电池焊上. 如果你想换电池同时保持数据, 你就需要用某种方法在整个更换过程中保持对存盘 RAM 的电压供应.
NES 上的扩展接口是用来干什么的?
扩展??? 恩, 很少使用, 虽然 Famicom 上的扩展接口可以连接很多设备, 比如立体眼镜 (3-D glasses), 键盘, 磁带机 (我认为), 等等. NES (据我所知) 只有两个附件使用扩展接口: Miracle Keyboard Piano Teaching System, 和 Baton Teleplay System, 这是一个提供面对面进行 NES 游戏的调制解调器, 还是金手指. 我不认为 Teleplay 可以很广泛的发售.
--------------------------------------------------------------------------------
模拟
Top
模拟是非法的吗?
理论上讲, 合法. 事实上, 一般来说, 非法. 现在让我们来弄清楚. 如果你制作了一份 Nintendo 游戏的备份 (不论什么原因), 并且在模拟器上运行, 那么你并没有违背版权法. 在美国, 为了教育和作档案的原因 "公平使用 (fair use) " 媒体和游戏的拷贝是可以的. 然而, 如果你同时在模拟器上和 NES 游戏机上同时玩同一个游戏; 如果你在模拟器上玩那些你并不合法拥有的游戏; 如果你从互联网上下载一个游戏 ROM; 上述这些情况都被认为是不合法的 (违反了版权法的内容和 "公平使用" 的学说) . 可以说大多数背模拟的游戏都是违反版权法的, 因为看起来并不是对于某个特定游戏的特定用户都拥有该游戏的卡带. 关于这个没有什么 "假如", "并且", 或者 "但是" 什么的. 关于这个问题没有必要继续争论了.
然而, 我认为模拟老的, 陈旧的系统 (比如雅达利 2600 以及也许 NES), 和模拟较新的, 正在发售的系统, 比如 N64, GameBoy Color, 和 GameBoy Advance. 在一个游戏发售后拷贝游戏 ROM 只是想免费获得一个游戏的差劲的借口. 相反的, 我认为模拟老系统是使该系统能够继续存在的一种方法, 永恒存在. 我们可以看到被模拟的 Famicom Disk System 的硬件和软件比原来得系统更长寿. 我有两台 FDS 磁盘驱动器, 但是都坏了; 可以看出来模拟唯一可用的保持使这些游戏和系统存在下去的方法.
Nesticle...
Nesticle 不应当被用作测试游戏或者自制的 demo 的模拟器. 虽然 Nesticle 曾经是许多年来最流行的 NES 模拟器, 但是他还远不够精确. 现在请删除掉 Nesticle 吧, 然后找一个更精确的模拟器!! 对于所有精确的需要, 我推荐 LoopyNES. 我对这件事并不是很显眼感到高兴.
怎样才能拷贝/备份 NES 游戏?
这并不容易. 你可以自己做一个拷贝设备 (à la IO-56), 或者请别人给你做一个 (à la CopyNES, 由 Kevin Horton (但是不要因为这而打扰他, 因为现在他已经不再出售这些东西了) ), 或者买一个稀有的 Hong Kong 拷贝装置. 说实话, NES 拷贝器的世界非常小, 因为 NES/Famicom 卡带有很多种存储镜像. 拷贝器需要考虑到各种镜像, 这样才能够拷贝全部卡带. 可用的拷贝器都变得很旧了, 很多都已经没有价值了, 因为他们只是把游戏备份到 (不充足的) FDS 磁碟上!
另外一个办法是把想要 dump 的游戏 (确定它们还没有被 dump 过) 寄给那些知名的 NES dump 专家. 我并不是这种人! :- (
怎样才能把 X 游戏拷贝到卡带上?
啊... 在这个问题上我们应当感谢 Earth Bound Zero. 当然, 如果说得一般一些, 你应当找到一个于游戏 X 相同型号或者兼容型号的卡带. 应当找到一个有相同的电路板类型, 相同的内存镜像, 相同的 RAM 芯片, 相同的备份电池 (如果需要), 以及至少于要拷贝的游戏 (ROM) 有相同的 ROM 大小. 记得如果你往卡带上拷贝那些从互联网上下载的非免费 (non-freeware) 游戏的话, 那将是非法行为.
不管怎么说, 处理的过程包括从上述的卡带上移除 (desoldering) 掩膜 ROM, 安装上带有 socket 或者 EPROM 的 ROM. 你需要把 PRG ROM 和 CHR ROM 中取出的数据分别写入 EPROM (如果你已经有 EPROM 了, 这些是很简单的). 如果你对 PRG ROM 和 CHR ROM 并不熟悉, 读一下这份 FAQ 中的 iNES header 部分. 一般来说 EPROM 的针脚与掩膜 ROM 并不兼容, 所以你必须对 EPROM 的输出针脚非常熟悉以进行必要的配线转换. 这并不是初学者能作的!
可以制作/购买通用型 NES 卡带吗?
不可能, 绝对办不到. 为了使 NES 卡带 "通用化", 你必须以可以兼容全部现有的内存镜像的方式制作卡带. 与通用型卡带最相近的是 NES/Famicom 拷贝器, 以及一种被叫作 Dr. PC Jr. 的系统, 由 Bung 制造. Dr. PC Jr. 从标准的 3.5" 磁盘中读出游戏, 然后你就可以在 TV 或 显示器上玩游戏了. 这个系统只支持很少的镜像, 但是 Bung 的魔法将这个系统训练得可以使多种不同的游戏镜像可以在其上运行.
我想做模拟器. 应当从那里入手呢?
想做模拟器的想法是非常好的, 但是应当知道, 现在已经有数不尽的 NES 模拟器了. 你是想做一个与其他所有模拟器都与众不同的呢, 还是只是想做一个模拟器而已? 如果你不能够想出一种方法使你的模拟器比现在所有其他类型的模拟器都好, 而只是做了一个普普通通的模拟器, 那么你最好自己保留这个模拟器, 只有你自己勇以及教学用.
不管怎样, 当然, 你写不出一个能够模拟你所不熟悉的游戏系统的模拟器. 这就是为什么我总是建议在做自己的模拟器之前最好做一些自己的 NES demo. 你需要知道 CPU 是如何工作的, PPU 怎样运转, 以及音频通道如何工作. 这些都可以通过测试你自己写的 NES 程序而很好的掌握. 事实上, 这是做好的途径了. 所以, 这是 NES 那边的事.
PC 这边的事是 (PC, 我的意思是指一般的个人电脑, 并不是特指 IBM PC), 你需要熟悉如何在各种显示模式下如何快速显示图形, 如何控制计算机的声音硬件接口, 如何处理键盘, 鼠标, 和手柄的输入. 将速度调整到稳定的 60Hz 对游戏机模拟器来说是非常重要的, 比如 NES. 如果你对这些并不熟悉, 那么你会得到相同的建议: 我建议你在你的 PC 上写一些 demo 或者只是一个小游戏. 做一个模拟器就像是将两种系统结合: 如果你对你要模拟的系统和你的程序运行平台系统并不精通, 那么写出来得将是一个次品.
¥?#181; a®3 £ee+, g0+ an¥ ROMz +?g¡v3 m3?
Having 25,632,890 ROMz doesn't make one "'leet," nor does using lame "'leetspeak," so stop trying. If there's such a thing as "'leetness" in the NES world, it comes from doing amazing and ingenious things with the NES hardware (and software), such as what is routinely done by humble people like Kevin Horton, Mark Knibbs, and others.
(译注: 本人放弃翻译这个问题, 因为我实在不知道怎样用汉语忠实而又生动的表现作者的意思. 作者在这个问题中表达了自己对 lamers 的一些观点. 至于什么观点, 自己体会吧.)
怎样才能把 .FDS 文件读入我的模拟器?
首先, 你的模拟器必须支持 Famicom Disk System. 如果不支持, 那只能说你的运气太差了. 对于不同的模拟器, 读入现在的 FDS 磁碟的方法并不一样, 但是一般来说包括读入磁碟, 然后点击某个按钮来 "插入" 磁碟或 "弹出" 磁碟旁边那个. 注意, 有时在模拟器运行磁碟之前需要有一个 8K FDS ROM 的二进制映像文件.
很不幸的是在模拟界存在两种稍有不同的 .FDS 格式: 一种没有文件头 (header), 另一种有. 模拟器 iNES 支持那些直接从 FDS 磁碟媒质上一个字节一个字节的复制下来的没有任何文件头的 FDS 磁碟文件. 其他模拟器可以读入包含了用来简单描述磁碟镜像中扇区个数的 16 字节的文件头. 让人充满希望的是大多数模拟器最终将支持这两种 .FDS 镜像.
什么是 iNES 的文件头?
iNES 文件头是当今 NES 模拟器界实际上的标准. iNES 文件头是 .NES ROM 开始处的 16 字节区域, 这个区域描述了这个游戏的大小和镜像的类型, 等等. 关于 iNES 文件头的细节, 请参考 nesdev.parodius.com 的文档. .NES ROM 的组成开始到结束是: iNES 文件头, [数字逻辑运算器 (trainer)], X PRG ROM 区, [Y CHR ROM 区]. (方括号表示那些部分是可选的, 具体情况依赖与不同的游戏.) 数字逻辑运算器虽然很少见, 但一些游戏有这一部分.
对于 iNES 格式来说, PRG ROM 区的数据大小是 16384 字节. 因此 PRG ROM 是游戏程序的镜像. 这一点至今依旧被模拟器执行着. 首先由镜像来决定在 NES 存储区域中的上述区域如何映射. 有些游戏没有 CHR ROM 区, 它们把图形数据混合入了 PRG ROM. 这些游戏在运行的时候只简单的使用了 RAM 中的 8k 来存储 CHR 数据.
什么是 UNIF?
UNIF 是一种新的格式, 一般认为这种格式将会结束许多 iNES 带来的问题, 特别是笨拙且专制的隐式内存镜像. UNIF 将 dump 的游戏描述的很清楚来解决这个问题. 电路板类型, 内存镜像, ROM 大小等等都被定义得更加清楚. UNIF 也是一种被分成块类型, 这就是说程序员可以可以选择他的模拟器读 .UNF 的哪一部分 (非常重要!). 如果模拟器读到了一个没有被辨认出的块, 就可以跳过那个部分继续读后边的. 至今为止, 只有少数的模拟器支持 UNIF 格式, 这就是 UNIF 的最大缺点. 但是任何东西都要有个开始, 不是吗?
浏览下面的网站可以获得关于 UNIF 的更多细节 nesdev.parodius.com 或者 UNIF 网站.
有 iNES < - > UNIF 转换程序吗?
是的, 有这样的转换工具, 这个工具是开源的 UNIF lib 项目的一部分. NESDev "powers that be" 一般来说并不支持将 UNIF 格式转换回 .NES, 当然我们支持将 iNES 转换成 UNIF.
什么是 .IPS 补丁? 怎样才能使用它?
IPS 文件是一种很小的文件, 它们被用来以一种高效的方法改变 (或修补) 游戏 ROM (或者其他相关文件) 中的数据. 它们被用来通过一种不违反版权法的方法 (希望如此) 实现对 ROM 的 hack, 翻译和修补. 比如, 如果你翻译了一个游戏并且只是将翻译后的版本放在你的网页上, 那么你依旧是违反了版权法. 所以, 一般来说 IPS 文件所做的事情是告诉补丁程序游戏文件中的哪些内容需要被改动和改动成什么样子. 附加一点是 IPS 文件要比一个完整的打过补丁的 ROM 小很多.
你不能运行 IPS 文件 -- 这是经常发生的误解. (你能运行 MP3 文件吗? 我想不能.) 所以你需要有一个支持 IPS 文件的补丁程序. 它会载入 IPS 文件和游戏 ROM, 然后打补丁, 但是必须注意的是一些补丁程序覆盖原始 ROM, 所以打补丁之前要进行备份! IPS 补丁程序在许多计算机平台上斗存在, (包括我的 ol' Amiga!). 一个找你的计算机上用的 IPS 程序的好地方是 http://www.zophar.net/.
什么是 NSFs?
NSFs (Nintendo Sound Files: Nintendo 声音文件) 是游戏的音乐. NSFs 从游戏中被分离出来并且可以在与拥有 NSF 插件的 WinAmp 类似的音乐播放程序中播放. 这个格式有 Kevin Horton 在 1999 年开发出来, 它与用来分离 C-64 音乐的 SID 格式非常类似. NSFs 并不像其他系统中的 GYM 或者 (从某种意义上的) SPC 音乐文件, 因为 NSFs 并不记录 NES 音频信息. NSFs 的内部是从 NES ROM 中获取的 6502 程序代码和数据, 并且能够通过 NES 的音频硬件独立运行和发出声音. 这就是为什么 NSFs 能够像原始的音乐那样恰当的循环播放. 这样你就可以明白为什么有些人一直在找音乐代码, 分离它的入口点, 然后将它分割为另外一个文件. NSFs 听起来很棒. :-)
如何分离 NSFs?
你需要了解 6502 的机器代码, 并且对 NES 的声音寄存器很熟悉. 我写了一份关于 NSF 分离基础的完整的文档, 你可以在我的网站或在常去的地方找到.
--------------------------------------------------------------------------------
程序设计
Top
NES 游戏用什么语言编写, C, BASIC 或者其他语言?
几乎所有 NES 游戏都使用 6502 汇编语言编写, 因为低速的 NES 处理器需要这样. 也许有一些游戏使用 C 编写, 但我对此表示怀疑. (一些未授权的很差劲的游戏也许使用 C 或其他什么语言编写. :-)) 对 BASIC 来说也一样. 虽然 Bung 和 Nintendo 都有 Famicom 的 BASIC 硬件解释器, 但是由于它的速度太慢了, 所以不能使用类似 C 和 BASIC 的高级语言来编写专业的, 快速步调的游戏.
怎样才能开始编写 NES 程序?
首先, 学习 6502 汇编语言. 可以从图书馆里借一本汇编教材或者修相关课程. 汇编语言比其他语言要难很多, 因为你是直接与硬件打交道. (事实上, 这就是我为什么喜欢汇编语言.) 保证你对大多数 CPU 的工作原理熟悉, 比如访问内存, 指令寄存器, 和操作数. 关于 16 进制数系统 (Hexadecimal 或 HEX) 的只是至关重要.
第二, 到 nesdev.parodius.com 上逛逛, 读一些那里关于 NES 的内存如何分配, 寄存器都作些什么和 NES 的性能 (以及特性) 的技术文档. 一直读到你对 NES 硬件有一个和好的认识为止.
第三, 开始写 NES 的测试或 demo ROM. 你可以从找一些简单的 NES demo 代码开始, 来了解 NES 程序怎样启动, 内存如何清空, 如何初始化寄存器, 如何与 PPU 打交道. 找一个 6502 汇编器, 比如 DASM 或 X816, 来编译你的代码. 所有的工具都可以在 nesdev.parodius.com 下载到. 在那里还可以找到许多 demo, 我的 demo 可以在我的网站找到.
在此之后就是用你的 NES 只是来提高熟练度了. 好运!
NAME table, ATTRIBUTE table, 和 PATTERN table 是怎样结合在一起的?
NES 并不像 Windows PC 那样有一个可以直接存储每一个象素的颜色值的位图屏幕. NES 的 PPU 非常有限, 所以 NES 需要建立一个将一些不同的优化的内存区域结合在一起的屏幕显示. 首先, pattern table (图案表) 是一个访问 NES 的 CHR ROM 的小窗口. 它存储了 256 中不同的用来作背景的图形块 (每一个都是 8x8 象素), 以及另外 256 个给角色用的块. 当 name table 需要显示一个特定的图像, 它不需要逐点描绘它自己的存储器中的图形. 而是改为由 name table 存储一个与需要的块在 pattern table 编号相同的数.
NES 有 16 种背景色 (background palette), 其中有一些镜像. 但是 name table 中的一个块不能同时访问全部 16 色; 它只能被调色板的 16 色中的 4 色构成. 这只是有 Nintendo 强加的限制. 于是 attribute table (属性表) 被引入, 来描述一个特定的块将会使用调色板 16 色中的哪 4 色. 因为 attribute table 非常小 (64 bytes), 它只能确定 2 tiles x 2 tiles. 所以每个 16x16 象素背景区域需要共享相同的 4 色. MMC5 内存镜像克服了这个问题, 但是如果没有它, 你就只能坚持 NES 的规定了.
|
|