【发生了什么?】

嗯,你是个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有点痛苦。明天我们会弄明白更多内容。明儿见!