-
Notifications
You must be signed in to change notification settings - Fork 24
/
nes-asm.txt
107 lines (64 loc) · 3.38 KB
/
nes-asm.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
https://github.com/zengfr/romhack
https://gitee.com/zengfr/romhack
NESASM
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)设置主角属性;
主角出场!
我们明天学习怎样载入调色板。调色板很重要,一半是背景调色,一半是主角调色。