NESASM教程——第三天——NES编程相关

【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)设置主角属性;

主角出场!

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

你可能感兴趣的:(NESASM教程——第三天——NES编程相关)