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

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

性格式是:

动画/精灵属性RAM:

| 精灵#0 | 精灵#1 | ... | 精灵#62 | 精灵#63 | 字节 位 描述 0 YYYYYYYY 精灵左上角的Y坐标-1 1 IIIIIIII Tile索引号 v=垂直翻转(1=翻转) h=水平翻转(1=翻转) 2 vhp000cc p=背景优先权(0=前台1=后台) c=颜色的高2位 3 XXXXXXXX 精灵左上角的X坐标 Tile索引号就和命名表里的一样。精灵图案可以象Tile图案对于背景图片一样抓取。唯一的不同是在8x16的精灵时,上半部分(偶数号码)的Tile索引由精灵图案表的$0000开始,而下半部分(奇数号码)由$1000开始。$2000寄存器对8x16精灵无效。全部64个精灵有自己内部的优先权,0号最高(最后被画),63号最低(最先被画)。每条扫描线只能显示8个精灵,每个精灵RAM条目都会被检查是否处于其他精灵的水平范围内。注意,这是基于扫描线的,不是基于精灵的,也就是说,会进行256次检查,而不是256/8或256/16次。在一个真实的NES芯片里,如果精灵被禁止($2001的D4是0)很长一段时间,精灵数据会渐渐消失。可以理解为精灵RAM是一个DRAM,D4控制了DRAM的周期刷新信号。

碰撞标志:

碰撞标志是PPU状态寄存器($2002)的第6位(D6)。PPU能够找出0号精灵的位置,然后设置D6,它是这样工作的:PPU扫描出背景图案象素和精灵象素同时不是透明的第一个地方。比如,屏幕的背景是一个非透明颜色(颜色号>0),0号精灵的坐标是(12,34),它只是在第4行的开始才有象素,那么,碰撞标志在屏幕刷新到(12,37)时才被设置。要记住,0号颜色被定义为透明。引起D6被设置的象素必须是已经被画出来的。下面的例子能帮助理解,这是两个Tile,下划线表示透明的0号颜色,*号表示碰撞标志被设置。 精灵 背景 结果 __1111__ ________ __1111__ _111111_ _______2 _1111112 11222211 ______21 11222211 112__211 + _____211 = 112__*11 ‘*’会用2号颜色画出 112__211 ____2111 112_2211 11222211 ___21111 11222211 _111111_ __211111 _1111111 __1111__ _2111111 _2111111 这个例子说的是背景+精灵,但是对于靠近背景的精灵也通用,即精灵+精灵,通过设置背景优先权来实现。D6不可以通过读PPU的状态来复位,只在每次VBlank之后被清零。Hit标志可以用在水平或者垂直屏幕分割的时候,还有许多好玩的效果。

水平和垂直消隐:

所有的游戏机都有一个刷新动作,用来重新定位电子枪显示可见的数据。最通用的显示设备是电视机,它分为每秒刷新60次的NTSC制式和50次的PAL制式。电子枪从左到右画出象素,它每次只能画一条扫描线,画下一条之前要先回到左面并且做好准备,这之间有一段时间叫做水平消隐(HBlank)。在画完全部256条扫描线之后它又回到屏幕左上角准备下一次画屏幕(帧),这之间的一段时间就是垂直消隐(VBlank)。电子枪就是一个不断的走‘之’字形的过程。VBlank标志就是$2002的D7,它表明PPU是否在VBlank期间,当VBlank标志存在时,你就可以通过$2006和$2007访问PPU内存。一个程序可以通过读$2002来使D7复位。在屏幕刷新期间,我们不能访问PPU,而PPU会在CPU背后修改VRAM指针,这样我们很容易在写入VRAM时出错,为了让PPU停下来,可以对$2000和$2001写00。

访问PPU RAM:

在一个任天堂主机,访问PPU内存只可以在VBlank期间。当在屏幕刷新时访问会破坏刷新地址寄存器,一般它经常用来做隐含的“分割屏幕”效果(见“在屏幕刷新的时候访问VRAM”)。很多小些的ROM用只读存储体(VROM)用做图案表。在这种情况下,你不可以写PPU地址,只可以读。 写PPU记忆体:

a) 写高位地址字节到$2006 b) 写低位地址字节到$2006

c) 写数据到$2007。每一个写操作后,地址会增加1($2000的第二位是0)或增加32($2000的第二位是1)。 读PPU记忆体:

a) 写高位地址字节到$2006 b) 写低位地址字节到$2006

c) 从$2007读数据。从$2007读到的第一个字节是无效的(见下例)。然后每读一次地址就增加一($2000的第二位是0)或增加 32($2000的第二位是1)。

例子:VRAM的$2000里有$AA $BB $CC $DD。VRAM的增量是1。执行效果如下: LDA #$20 STA $2006 LDA #$00

STA $2006 ; VRAM 地址设为 $2000 LDA $2007 ; A=?? VRAM 缓冲=$AA LDA $2007 ; A=$AA VRAM 缓冲=$BB LDA $2007 ; A=$BB VRAM 缓冲=$CC LDA #$20 STA $2006 LDA #$00

STA $2006 ; VRAM 地址设为 $2000 LDA $2007 ; A=$CC VRAM 缓冲=$AA LDA $2007 ; A=$AA VRAM 缓冲=$BB

这个只适用于$0000-$FEFF,访问调色板数据没有这种现象。

在屏幕刷新的时候访问VRAM:

前面说过,在屏幕刷新的时候存取VRAM的地址和数据是不合法的。许多程序存取这些寄存器来制造不同的滚动效果。比如,一些游戏从屏幕底部开始滚动,那么它可能向$2006写第一行的状态来复位屏幕滚动。更好的诡计是PPU在屏幕刷新时用VRAM的地址寄存器来储存当前地址。通过向$2006修改地址以及让PPU从一个不同的地方接着刷新。关于$2007如何影响屏幕刷新仍不了解。 当不知道向$2006中写什么数据时,看下面的图表。 写到$2006的地址

位 描述 0-Tiles的水平偏移量(例如1 = 8象素);水平位置=水平偏移量×8 4 5-Tiles的垂直偏移量(例如1 = 8象素);垂直位置=垂直偏移量×8 9 A、命名表的号码($2000,$2400,$2800,$2C00); B C、附加的垂直偏移量,单位:象素(0..3);扫描线=垂直偏移量+附加的垂D 直偏移量 E、00 F 5、声音处理器

NES的集成CPU里包含了一个4声道的声音处理器(2A03),为播放音乐提供准模拟的声音。4个声道分别是:2个方波,一个三角波和一个噪声发生通道,每个声道的特性都不一样。

声道:

方波声道能够产生54.6Hz到12.4KHz的方波,它的主要特性是频率扫略功能和调整输出的占空周期;三角波声道可产生27.3Hz到55.9KHz分辨率是4位(16级)的三角波,它的主要特性是输出模拟三角波和线性计数器(可用来定时关闭声道);噪声通道能产生29.3Hz到44.7KHz的随机噪声,它的主要特性是产生伪随机数,在声道输出随机频率。

帧计数器:

2A03有一个内含的帧计数器,它能够产生60Hz(1/1帧率)、120Hz(1/2帧率)和240Hz(1/4帧率)的信号,提供给其他一些声音硬件使用。1/4帧率的信号是由CPU频率乘以2即3579545Hz再除以14915得到的。

声音硬件延迟:

在2A03复位之后,到各个声音硬件开始接收时钟信号之间有2048个时钟周期的延迟。当这2K个时钟周期之后,声音开始正常工作,输出使能有效。这种现象只发生在系统复位之后的2048个时钟周期内。这个资料的准确性有待验证。 控制寄存器:

2A03的声音控制寄存器在CPU内分配的特殊地址如下: 寄存器地址 描述 $4000-$4003 方波1 $4004-$4007 方波2 $4008-$400B 三角波 $400C-$400F 噪声 $4015 声道使能、音长计数状态 只有$4015是可读可写的,其他都是只能够写的,如果你读这些寄存器最可能得到的是$40(因为NES数据线的重负荷)。读这些只写寄存器对寄存器本身和声道都没有任何影响。每个声音通道都有4个寄存器,具体描述如下: 寄存器\\位 $4000/$4004/$400C 0 1 2 3 音量衰减率 4 5 6 7 音长计数中无衰止/衰减循环占空周期类型 减 使能 扫描使能 1减少/0$4001/$4005 右移量 增加波扫描更新率 长 $4002/$4006/$400A 波长低八位 波长高三$4003/$4007/$400B/$400F 音长计数值 位 $4008 $4009/$400D $400E $4015:音长状态(读) 线性计数值 未使用 播放采样率 未使用 音长计数中止/线性计数开始 随机数类型发生 DMC的IRQ状态 方方三噪声 DMC 未使用 1 2 角 方方三$4015:通道使能(写) 噪声 DMC 未使用 1 2 角 声道结构体系: 总表: