【PPU】

NES上发生的一切都需要通过图形方式输出,我们需要对PPU(图像处理单元)编程。其实很简单,就是向特定内存地址写一些数值,然后PPU的设置就被修改为你设置的值。NES所有编程都使用所谓的内存映射寄存器(MMR)实现。如果你给GBA编过程序,肯定知道MMR。但对于Intel芯片知识来说,MMR是个外星人。

【二进制注意事项】

为了绝对清晰,我们将按以下顺序给出内存寄存器的比特(0x63):

bit: 7 6 5 4 3 2 1 0

val:0 1 1 0 0 0 1 1

所以,第7比特位于最左边,第0比特位于最右边。

【设置PPU】

注意首先要做的一件事是设置PPU。我们只需向存储器$2000和$2001写一些值,这两个地址对应两个PPU控制寄存器。为了解释$2000和$2001,下面从YOSHi的文档里面摘抄的寄存器描述:

2000h - PPU 控制寄存器 1 (只写)

Bit7 发生VBlank时执行NMI (0=Disabled, 1=Enabled)

Bit6 PPU 主从模式选择 (0=主模式, 1=从模式) (NES中没用)

Bit5 主角尺寸 (0=8x8, 1=8x16)

Bit4 背景Pattern Table 首地址 (0=VRAM 0000h, 1=VRAM 1000h)

Bit3 主角Pattern Table 首地址 (0=VRAM 0000h, 1=VRAM 1000h)

Bit2 端口0x2007 VRAM 地址增量 (0=自动增1, 1=自动增32)

Bit1-0 Name Table卷轴首地址 (0-3=VRAM 2000h,2400h,2800h,2C00h)

(也就是说,Bit0=水平卷轴滚动256, Bit1=垂直卷轴滚动240)

2001h - PPU 控制寄存器 2 (只写)

Bit7-5 颜色增强 (0=正常, 1-7=增强)

Bit4 主角可见 (0=不显示, 1=显示)

Bit3 背景可见 (0=不显示, 1=显示)

Bit2 主角切除 (0=切除左边8个像素列, 1=不切除)

Bit1 背景切除 (0=切除左边8个像素列, 1=不切除)

Bit0 灰度模式 (0=彩色模式, 1=灰度模式)

为了设置PPU,我们进行两次写内存操作,代码为:

lda #%00001000

sta $2000

lda #%00011110

sta $2001

我们写入$2000的值表示告诉PPU以下内容:

NMI禁止了;

主角尺寸8x8;

背景Pattern Table起始地址$0000;

主角Pattern Table起始地址$1000;

地址自动增1;

NameTable起始地址$2000;

写入$2001的值告诉PPU:

不要影响调色板;

显示主角;

显示背景;

显示所有位置的主角;

显示最左边8像素;

彩色模式;

你自己应该能从二进制码读懂上述具体含义。

【为了获得输出我们还需要做什么?】

如果你说的是背景,我们还要做:

制作一个背景;

a. 绘制一些tile(用Tile Layer Pro);

b. 在段2首先包含上面的tile文件;

c. 创建并载入一个调色板;

d. 在Name Table中设置显示的tile号码

这样就显示了背景!

如果是主角,那么顺序应该是这样:

制作一个主角:

a. 在Tile Layer Pro中绘制主角;

b. 段2中包含该文件作为第二个;

c. 创建并载入调色板;

d. 在主角数据区(类似GBA中的OAM)设置主角属性;

主角出场!

我们明天学习怎样载入调色板。调色板很重要,一半是背景调色,一半是主角调色。