跳转到内容

NES 编程/初始化 NES

来自维基教科书,开放世界中的开放书籍

虽然有一些 NES 编译器可以使用高级语言(参见参考资料),但大多数 NES 编程都是使用汇编语言完成的。如果你还没有这样做,最好看一下之前的教程“关于汇编语言的几句话”。对于那些想了解更多关于 NES 汇编语言信息的人,请查看下面提供的一些链接。对于下面的代码示例,我将使用 P65 汇编器,我认为它比 NesAsm 不那么令人困惑。它也是用 Perl 编写的,所以任何人都可以使用它。


INES 头部

[编辑 | 编辑源代码]

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.

编程 PPU

[编辑 | 编辑源代码]

NES 上的图形处理单元 (PPU) 负责将图形显示到屏幕上。它包含四个主要组件,用于显示背景和精灵图像:模式表、名称表、属性表和精灵/图像调色板。模式表存储用于在屏幕上显示任何内容的 8x8 或 8x16 像素图像。这些图像中的每一个最多可以存储四种不同的颜色。名称表用于显示背景图像,属性表会影响可以显示在背景上的颜色。最后是精灵和图像调色板,它们分别包含前景精灵和背景图像的可能颜色。

模式表

敬请期待...

名称表

敬请期待...

属性表

敬请期待...

精灵和图像调色板

敬请期待...

P65 汇编器 - 可移植的 6502 系列汇编器,本程序中所有示例代码都是使用它编写的。

6502 汇编器指南 - 6502 汇编语言世界的一个很好的介绍。

Nes Dev - 一个很棒的网站,提供了大量关于 NES 编程的资源,以及对替代编译器的链接。

华夏公益教科书