NES 编程/初始化 NES
虽然有一些 NES 编译器可以使用高级语言(参见参考资料),但大多数 NES 编程都是使用汇编语言完成的。如果你还没有这样做,最好看一下之前的教程“关于汇编语言的几句话”。对于那些想了解更多关于 NES 汇编语言信息的人,请查看下面提供的一些链接。对于下面的代码示例,我将使用 P65 汇编器,我认为它比 NesAsm 不那么令人困惑。它也是用 Perl 编写的,所以任何人都可以使用它。
INES 头部用于让模拟器了解你试图加载的 NES ROM 的规格。任何 nes 文件的前三个字节包含字符“NES”,后面跟着十六进制 0x1A。注意,P65 的十六进制值以“$”开头。在这些初始信息之后是两个字节,分别代表 16K Prg-Rom 块和 8K Chr-Rom 块的数量。在没有映射器的情况下,最多可以有 2 个 Prg-Rom 块。
; iNES header
; iNES identifier
.byte "NES"
.byte $1a
; Number of PRG-ROM blocks
.byte $01
; Number of CHR-ROM blocks
.byte $01
; ROM control bytes: Horizontal mirroring, no SRAM
; or trainer, Mapper #0
.byte $00, $00
; Filler
.byte $00,$00,$00,$00,$00,$00,$00,$00
NES 有三个中断向量,它们代表 CPU 在发生某些类型的中断时跳转到的程序代码中的位置。NES 有三种不同的中断:不可屏蔽中断或 NMI($FFFA)、复位向量($FFFC)和 IRQ/BRK 向量($FFFE)。括号中的十六进制值是 NES 在其中查找要跳转到的 16 位位置的地方。
通常,复位向量会指向你的代码的开头,这取决于你拥有的 Prg-Rom 块的数量,可以是 $8000 到 $BFFF 或 $C000 到 $FFFF 之间的某个位置。
不可屏蔽中断是指当 PPU 刷新屏幕时发生的中断(也称为 V-Blank 周期)。在此期间,屏幕可以在没有任何闪烁效果的情况下更新。
最后,IRQ/BRK 中断(我喜欢称之为可屏蔽中断)是在发生 BRK 命令时使用的。它通常由程序员用于各种目的。
示例
reset: nmi: irq: rti
; ... more code
.advance $FFFA .word nmi, reset, irqq; words pointing to the location of nmi, reset and irq.
NES 上的图形处理单元 (PPU) 负责将图形显示到屏幕上。它包含四个主要组件,用于显示背景和精灵图像:模式表、名称表、属性表和精灵/图像调色板。模式表存储用于在屏幕上显示任何内容的 8x8 或 8x16 像素图像。这些图像中的每一个最多可以存储四种不同的颜色。名称表用于显示背景图像,属性表会影响可以显示在背景上的颜色。最后是精灵和图像调色板,它们分别包含前景精灵和背景图像的可能颜色。
模式表
敬请期待...
名称表
敬请期待...
属性表
敬请期待...
精灵和图像调色板
敬请期待...
P65 汇编器 - 可移植的 6502 系列汇编器,本程序中所有示例代码都是使用它编写的。
6502 汇编器指南 - 6502 汇编语言世界的一个很好的介绍。
Nes Dev - 一个很棒的网站,提供了大量关于 NES 编程的资源,以及对替代编译器的链接。