跳转到内容

NES编程/简介

来自Wikibooks,开放世界的开放书籍

NES编程教程1:欢迎来到机器

[编辑 | 编辑源代码]

推荐用于NES编程的语言是汇编语言,因为缓慢的8位处理器需要它。处理器类似于早期的英特尔芯片,但缺少某些功能。

6502处理器最多可以寻址64千字节的内存。可以将其视为一个具有65536个“单元格”的连续空间。每个“单元格”或字节可以存储0到255之间的数字。这个空间的前256个字节称为零页,6502可以稍微更快地访问它,并且只需一个字节。接下来的256个字节是堆栈。6502包含3个通用寄存器

A累加器 - 所有数据移动、数学和逻辑运算都通过这里进行。

X索引寄存器 - 用于通用计数和前索引内存偏移。

Y索引寄存器 - 用于通用计数和后索引内存偏移。

所有这些通用寄存器都可以用于任何目的,但上述原因是它们通常被用于的目的。

这些是特殊功能寄存器。

S堆栈指针 - 跟踪堆栈。

P处理器标志/状态 - 保存包含先前指令结果信息的标志。

P程序C计数器 - 跟踪程序正在执行的位置。


有几种方法可以访问内存

  • 立即数寻址

在这里,8位数字的精确值写入指令中。不会发生内存访问。要表示立即数,在数字前放置一个#,例如

        LDA #$15        ; load the value 0x15 into the accumulator
                        
                        ; $ - denotes a hexadecimal address
                        ; % - denotes a binary address
                        ; # - denotes an immediate value
                        ; #$ - denotes an immediate hex value
                        ; #% - denotes an immediate binary value
  • 直接寻址

16位地址存储在指令中。指定内存地址中的任何内容都将是数字。例如,

        LDA #$C4        ; load the value decimal 196 into the accumulator
        STA $2001       ; store the accumulator at memory address hex 0x2001
  • 零页寻址

与直接寻址类似,此方法访问绝对地址。但是,此方法通过仅在指令中写入低字节来节省一个字节。高字节假定为零。因此,此方法只能用于零页。以下示例显示了使用直接寻址和零页寻址的相同指令。

        LDA $00F8       ; Absolute, works but wastes space
        LDA $F8         ; Zero Page, saves a byte


还有更多寻址模式,但现在先坚持使用这些。如果您想知道LDASTA是什么,它们只是指令的名称。接下来介绍指令!


指令是告诉处理器执行某些操作的特定命令。这可能是将某些内容移动到内存中,添加一些数字,跳转到不同的位置等。总共有56条指令。接下来将描述最常用的指令。


您将学习的第一条指令是LDA。它代表LoaD A,它将数据复制到寄存器A中。数据可以是数字、地址或索引地址(有关此寻址模式的更多信息,请参见下一教程)。看看您是否能理解这个:LDX。如果您猜到是LoaD X,那么您是对的。我想我不需要解释LDY是什么了。


STA,第二常见的指令,代表STore A,它将A的值存储到内存中。STA $2000会将A的当前值存储到内存地址$2000中。它的对应指令包括STYSTX

另请参阅

[编辑 | 编辑源代码]

6502汇编

华夏公益教科书