任天堂产品系统文件

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" (5 位,3 位,等等)。位是按从最低位(0 位)到最高位(7 位)。所有的十六进制都在前面加上一个美圆符号()(2002,$4026,等等)是在6502处理器汇编里常用的符号,二进制前面加上一个百分号%。

2、缩写表

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

3、中央处理器

NES定制的6502内部特别加上了声音处理单元。NTSC制式的NES使用1.7897725MHz主频,PAL制式使用1.773447MHz主频。
CPU内存映像:

开始地址 用途 结束地址
$0000 2K字节RAM,做4次镜象(即0000-07FF可用) $1FFF
$2000 寄存器 $2007
$2008 寄存器(2000-2008的镜像,每8个字节镜像一次) $3FFF
$4000 寄存器 $401F
$4020 扩展ROM $5FFF
$6000 卡带的SRAM(需要有电池支持) $7FFF
$8000 卡带的下层ROM $BFFF
$C000 卡带的上层ROM $FFFF

中断:
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时序:

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

镜像是指通过硬件映射特殊的内存地址或范围的一个过程。

PPU内存映像:

开始地址 用途 结束地址
$0000 图案表0(256x2x8,可能是VROM) $0FFF
$1000 图案表1(256x2x8,可能是VROM) $1FFF
$2000 命名表0(32x30块)(镜像,见命名表镜像) $23BF
$23C0 属性表0(镜像,见命名表镜像) $23FF
$2400 命名表1(32x30块)(镜像,见命名表镜像) $27BF
$27C0 属性表1(镜像,见命名表镜像) $27FF
$2800 命名表2(32x30块)(镜像,见命名表镜像) $2BBF
$2BC0 属性表2(镜像,见命名表镜像) $2BFF
$2C00 命名表3(32x30块)(镜像,见命名表镜像) $2FBF
$2FC0 属性表3(镜像,见命名表镜像) $2FFF
$3000 2000-2EFF的镜像 $3EFF
$3F00 背景调色板#1 $3F0F
$3F10 精灵调色板#1 $3F1F
$3F20 镜像,(见调色板镜像) $3FFF
$4000 0000-3FFF的镜像 $7FFF

命名表:

NES 的图像通过Tile矩阵来显示,这个网格就叫命名表。一个命名表和字符模式下的屏幕缓冲比较相象,它包含字符的代码,也就是30列的32Byte长度。每个Tile有8x8个象素,每个命名表有32x30个Tile,也就是256x240象素。PPU支持4个命名表,他们在$2000,$2400,$2800,$2C00。在NTSC制式下,上面和下面的8象素通常不显示出来,只有256x224象素;在PAL制式下,屏幕有256x240象素。
需要说的是,虽然PPU支持4个命名表,任天堂主机只支持2个命名表。另外两个被做了镜像。命名表保存了Tile的编号,而Tile存在图案表里。计算命名表里Tile号对应的实际地址的公式是:
(Tile号×16)+由$2000端口指定的图案表地址

命名表镜像:
NES只有2048字节($800)的VRAM给命名表使用,但是如前表所示,NES有能力寻址到4个命名表。缺省情况下,NES卡带都带有水平和垂直镜像,允许你改变命名表指向PPU的VRAM位置。这种方式同时影响两个命名表,你不能单独改变其中的一个。每个卡带都控制着PPU地址线的A10 和A11。它可能将他们设置成以下4种可能的方式的1种。下面这个图表有助于理解NES里的各种镜像,指向PPU VRAM中命名表的12位地址相当于“$2xxxx”:

名字 命名 表#0 命名 表#1 命名 表#2 命名 表#3 说明 地址线A11 地址线A10
水平 $000 $000 $400 $400 1 0
垂直 $000 $800 $000 $800 0 1
4屏幕镜像 $000 $400 $800 $C00 卡带里有2K VRAM,4个命名表物理上独立的 1 1
单屏幕 $X00 $X00 $X00 $X00 所有的命名表指相同的VRAM区域,X=0、4、8、C 0 0
VROM镜像 Mapper 68#游戏映射VROM到PPU VRAM的命名表,这使得命名表是基于VROM的,你不能写它但却可以通过mapper自己来控制是否使用这种特性
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • 陷阱分发 陷阱(trap)指的是这样一种机制,当异常或中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到...
    kotw_zjc阅读 1,226评论 0 0
  • lab4 是实现多处理器支持以及抢占式任务调度,exercize代码见 这里。 1 多处理器启动流程 1.1 多处...
    __七把刀__阅读 4,644评论 0 4
  • 前面应该有一章,“一:操作系统的概述”,懒得写,但是很重要,最好去看下视频,如果有人看的话,以后有空再补 首先我们...
    Wcdaren阅读 1,732评论 0 1
  • 说几句废fu之言,前几天没有接着写进程调度记录的文章,当然现在也不会写,如题,从现在开始记录linux内核基础知识...
    Gitlusen阅读 1,581评论 0 0
  • 这次我就要旅游了,而且是出国旅游,这是我出国的第1站,以后肯定还会去到好多个国家。 今天是来到上海浦东国际机场。在...
    储烨磊2008阅读 182评论 0 1