任天堂产品系统介绍(doc 30页)(正式版) 联系客服

发布时间 : 星期二 文章任天堂产品系统介绍(doc 30页)(正式版)更新完毕开始阅读ff229c74541810a6f524ccbff121dd36a32dc49a

任天堂产品系统文件

(Pinokio@163.com 译、编 2002/10/10)

目录

_____________________________________________________________________

1、系统简介

任天堂主机由6502处理器和一个特制的图形处理器组成。CPU是6502,而不是传言中的65C02(CMOS)。PPU的显存是和CPU的内存是分离的,可以通过对特殊端口的读/写来操作。卡带可能包含的内容有位于处理器地址$8000-$FFFF的ROM,和位于PPU地址$0000-$1FFF的VROM。由于NES只有2K的RAM,因此变量的可用的变量空间只有从$0000到$07FF共8个页面。在开机之后RAM和VRAM中的内容是0,但是注意:复位并不改变其中的内容。在更小的卡带,比如只有16KB的ROM,它占有$C000-$FFFF,而$8000-$BFFF的空间是不用的。那些大于32KB的卡带,它被特殊的电路分页到一定的地址空间。一些卡带在

$6000-$7FFF有SRAM,那是电池存储的位置。卡带VROM被用来做图案表(例如 Tile 表, 角色发生器等等)。通常的数量是8KB,包含两个图案表。大于8KB 的VROM被特殊的电路分页到一定的地址空间。内部的VRAM在 PPU 内存里定位于$2000-$3FFF,它用来存储命名表(例如屏幕缓冲)。虽然PPU 支持4个命名表,但只能支持两个的存放空间。另外的两个是开始两个的镜像。NES共有154条指令。

在本文本里,你将遇到如下形式的符号:“Dn\3 位,等等)。位是按从最低位(0 位)到最高位(7 位)。所有的十六进制都在前面加上一个美圆符号($)($2002,$4026,等等)是在6502处理器汇编里常用的符号,二进制前面加上一个百分号%。

2、缩写表

NES FDS CPU PPU 任天堂娱乐系统 任天堂磁碟机系统 中央处理器,NES使用一个定制的6502(NMOS)芯片,有些型号为6527 图像处理器,用来处理背景,精灵和其他图像特性,通常为6538 Famicom 任天堂家用计算机,即FC APU MMC VRAM VROM ROM RAM SPR-RAM SRAM DMC 声音处理器,集合在CPU内部,包含4个模拟通道和1个数字通道 ROM和VROM的扩容控制,用来控制访问超过6502限制的64K地址,同样,也可以扩容VROM 图像RAM,PPU专用,2K字节 图像ROM,储存图像数据的地方,可以由MMC切换到VRAM里 程序ROM,实际程序储存的地方,扩容部分可以通过MMC切换到PRG-RAM里 程序RAM,和ROM同义,不同的是它是RAM 精灵RAM,RAM中的256字节,专用于储存精灵,它不属于VRAM或ROM 电池RAM,卡带上用来保存游戏记录的EPROM-电擦写ROM 三角波调制通道,APU用来处理数字声音的,也写作PCM通道 EX-RAM 扩展VRAM,用在MMC5里,可以扩展VRAM容量 3、中央处理器

NES定制的6502内部特别加上了声音处理单元。NTSC制式的NES使用1.7897725MHz主频,PAL制式使用1.773447MHz主频。 CPU内存映像: 开始地址 用途 $0000 2K字节RAM,做4次镜象(即$0000-$07FF可用) $2000 寄存器 $4000 寄存器 $4020 扩展ROM $6000 卡带的SRAM(需要有电池支持) $8000 卡带的下层ROM $C000 卡带的上层ROM 结束地址 $1FFF $2007 $401F $5FFF $7FFF $BFFF $FFFF $2008 寄存器($2000-$2008的镜像,每8个字节镜像一次) $3FFF 中断:

6502有3个中断IRQ/BRK、NMI和RESET,每个中断都有一个16位的向量,即指针,用来存放该中断发生时中断服务函数的地址。中断发生时CPU都会把状态标志和返回地址压栈,然后调用中断服务程序。

IRQ/BRK中断由一下两种情况产生:一是软件通过BRK指令产生,一是硬件通过IRQ引脚产生。

RESET在开机的时候触发,这是ROM被装入,6502跳到RESET向量指向的地址没有寄存器被修改,没有内存被清空,这些都只在开机是发生。

NMI指不可屏蔽中断,它在VBlank即屏幕刷新时发生,持续时间根据系统

(NTSC/PAL)不同而不同。NTSC是每秒60次,而PAL是每秒50次。6502的中断延时是7个时钟周期,也就是说,进入和离开中断都需要7个时钟周期。它产生于PPU的每一帧结束,NMI中断可以由$2000的第7位的1/0控制允许/禁止。

大部分中断应该使用RTI指令返回,但是有些游戏不用,例如《最终幻想

1》。它用一个很奇怪的方式:手工修改堆栈指针,然后执行RTS指令。这种方法在技术上是可行的,但是应该尽量避免。 以上中断在ROM内有以下对应的地址: 中断地址 中断 优先权 $FFFA NMI 中 $FFFC RESET 高 $FFFE IRQ/BRK 低 特别说明:

NES的6502不支持10进制。虽然CLD和SED指令都正常工作,但是ADC和SBC都不使用CPU状态标志的“D”位。由于复位后“D”位的状态是不确定的,所以游戏通常在程序开始时使用一个CLD指令。

声音寄存器映射到CPU内部,所有波形发生的工作都在CPU内部完成。

注意那两个分开的16K ROM段,它们可能是连续的,但是它们根据卡带的大小扮演不同的角色。有的卡带只有一个16K ROM,那么它就同时被装入$8000和$COOO。

所有游戏都将它们自己装入$8000,使用32K RAM,但是它们都能够通过内存映射把多于一个16K ROM装入$8000。VROM也是同样的道理。

当BRK中断发生的时候,CPU把状态标志压入堆栈,同时设置“B”标志。而IRQ中断发生时,CPU把状态标志压入堆栈,同时清除“B”标志。这是因为6502使用同一个向量来处理两种中断,用“B”标志来区分它们。你可以用以下程序来区别两种中断:

C134: PLA ; 拷贝CPU状态标志到A

C135: PHA ; 把状态标志还回给堆栈

C136: AND #$10 ; 检查“B”标志

C138: BNE is_BRK_opcode; 如果设置了,就是软件中断(BRK) 在NMI里指向BRK会导致已经被压栈的“B”标志被设置。

6502的$6C指令(间接绝对跳转)有一个BUG,当低位字节是$FF时CPU将不能正确计算有效地址。例如: C100: 4F C1FF: 00 C200: 23 ..

D000: 6C FF C1 - JMP ($C1FF)

本来它是应该跳到$2300的,但是在计算高位字节的时候,在页面边界处地址

是不能再增加的,所以实际将跳转到$4F00。

需要注意的是,页面越界不会在变址间接寻址模式发生。由于0页面的限制,由于0页面的限制,所有变址间接寻址的读写都应该在计算有效地址之后和#$FF进行逻辑与操作。例如:

C000: LDX #3 ; 从 $0002+$0003 读变址地址, C002: LDA ($FF,X) ; 不是 $0102+$0103.

_________________________________________________________________________________

4、图形处理器

PPU时序: 基频(Base clock) CPU主频(Cpu clock) 总扫描线数(Total scanlines) 水平扫描周期(H-Draw cycles) 水平空白周期(H-Blank cycles) 结束周期(End cycles) 帧周期(Frame cycles) 帧IRQ周期(FrameIRQ cycles) 帧率(Frame rate) 帧时间(Frame period) NTSC制式 21477270.0Hz 1789772.5Hz 262 1024 340 4 1364*262 29830 60(59.94Hz) PAL制式 21281364.0Hz 1773447.0Hz 312 1024 338 2 1362*312 35469 50Hz 扫描线总周期(Scanline total cycles) 1364(15.75KHz) 1362(15.625KHz) 1000.0/60.0(ms) 1000.0/50.0(ms)

镜像是指通过硬件映射特殊的内存地址或范围的一个过程。 PPU内存映像: 开始地址 用途 $0000 图案表0(256x2x8,可能是VROM) $1000 图案表1(256x2x8,可能是VROM) $23C0 属性表0(镜像,见命名表镜像) $27C0 属性表1(镜像,见命名表镜像) $2BC0 属性表2(镜像,见命名表镜像) 结束地址 $0FFF $1FFF $23FF $27FF $2BFF $2000 命名表0(32x30块)(镜像,见命名表镜像) $23BF $2400 命名表1(32x30块)(镜像,见命名表镜像) $27BF $2800 命名表2(32x30块)(镜像,见命名表镜像) $2BBF