【发生了什么?】

嗯,你是个NES小白程序员,今天我们将学习一个NESASM代码文件的结构。不幸的是,我们的汇编器对缩进非常讲究,一行的开始位置只能放标签,放其他所有内容都必须加一个【TAB】键缩进。尽管这样听上去很糟糕,但这样确实提高了可读性,让你更容易理解代码,尤其是大程序。


【关于段(Bank)】

不不不,Bank不会帮你拿着你的钱,它们帮你拿着你的程序和数据。我们将经常用三个段:

段 0 —— 放我们的代码,起始于$8000

段 1 —— 中断向量表,很重要,起始于$FFFA

段 2 —— 我们将主角和背景数据点阵信息放在这里,起始于$0000


我不确定一共有多少段,但显然至少3个。我们将用.bank指令来移动段,用.org指令来告诉汇编器在那个段我们的起始地址是什么。


【INES文件头】

INES文件头放在每个ROM文件的开头,告诉模拟器一些信息,它们是:

.inesprg —— 告诉模拟器有多少个代码段

.ineschr —— 告诉模拟器有多少图片数据段

.inesmir —— 告诉模拟器……我忘了是什么,但总是1

.inesmap —— 我们总是用Mapper 0


我们常用设置为:

.inesprg 1   ; 一个代码段
	.ineschr 1   ; 一个数据段
	.inesmap 0   ; 使用mapper 0
	.inesmir 1   ; 总是1



这四行将放在(几乎所有)代码文件的最前面。


【段0和.org】

我们使用段0来放代码,起始地址为$8000。代码将这么写:

.bank 0   ; 段 0.
	.org $8000  ; 去 $8000.

	; 真正代码从这里开始



就这么多。注意分号(;)后面的内容为注释,汇编器忽略一行分号后面的所有内容。


【段1和三个中断向量】

不用长篇大论,直接来点美味小吃代码如何?

.bank 1     ; 切到段 1
	.org $FFFA  ; 从 $FFFA开始

	.dw 0        ; NMI中断向量
	.dw Start    ; 复位向量,复位时从这个地址开始运行代码,我们给出了Start标签的地址,该标签最终放在段0中
	.dw 0        ; VBlank 中断向量,目前我们不需要



段1内容就这么多,简单!


【段2和图片数据】

段2,我们将从地址$0000开始,里面包含我们的图片数据,可用于背景和主角显示。代码如下:

.bank 2        ; 切到段 2
	.org $0000    ; 从 $0000开始

	.incbin "our.bkg"  ; 包含二进制文件,内容为我们的背景图片数据
	.incbin "our.spr"  ; 包含二进制文件,内容为我们的主角图片数据



【今天内容复习】

今天真的就这么多。我觉得有点慢了,因为NES编程相对GBA有点痛苦。明天我们会弄明白更多内容。明儿见!