NES专题——6502CPU指令集及特点

目录

摘要

一、2A03概述

二、CPU内存映射

三、寄存器

四、中断

五、寻址模式

六、指令

七、参考资料


摘要

本文主要介绍6502CPU的内存映射、寄存器、中断、寻址模式以及指令等。为详细参阅《Nintendo Entertainment System Documentation(任天堂娱乐系统文档)》CPU部分后的总结,只摘出了重要部分,如需进一步了解6502CPU有很多的附录图表还是需要到文档中去查阅的,这个文档也会在后面的资料链接中给出,文档是英文的,英文不太好的话可以用翻译工具来看。下文基本都是我根据文档来写的,但是加了一些自己的解释和理解。2A03是6502的改进版,增加了音频处理单元,所以文档中是以介绍2A03的方式来介绍6502的。.

 

一、2A03概述

理光生产的NMOS处理器是基于6502的改进的,叫2A03。该芯片与标准的6502芯片的不同之处在于它可以处理声音,充当CPU和pAPU(伪音频处理单元),而且它没有二进制编码的十进制(BCD)模式,该模式允许使用4位来表示每个数字。出于编程目的,2A03使用与标准6502相同的指令集,如下图所示。6502是一个小端字节处理器,这意味着地址首先存储在内存中最不重要的字节,例如地址$1234在内存位置x中存储为$34,在内存位置(x+1)存储为$12。(“$”在手册上表示的是十六进制的意思)。

扫描二维码关注公众号,回复: 11174446 查看本文章
6502处理器

二、CPU内存映射

内存被分为三个部分,内存卡内的ROM、CPU的RAM和I/O寄存器。地址总线用于设置所需位置的地址。控制总线用于通知组件请求是读还是写。数据总线用于将字节读写到所选地址。请注意,ROM是只读的,可以通过MMC访问,以便进行Bank的切换。I/O寄存器用于与系统的其他组件(PPU和控制设备)通信。如下处理器框架图显示了CPU如何使用总线访问内存。

处理器框架图

2A03有一个16位地址总线,因此可以支持64 KB的内存,地址是$00000 - $FFFF。下图的“CPU内存映射图”是NES使用的CPU内存映射,显示了内存的整体布局。左边部分是显示主要部分的简化版本,而右边的部分进一步划分了这些部分。“Zero Page”是指$0000-$00FF范围内的地址,这是内存中的第一个页,某些寻址模式使用它来允许更快地执行。内存位置$0000-$07FF在$0800-$1FFF镜像三次。这意味着,例如,任何写到$0000的数据也将被写到$0800、$1000和$1800。内存映射的I/O寄存器位于$2000-$401F。$2008-$3FFF区域中的位置$2000-$2007每8个字节镜像一次,其余的寄存器都遵循这个镜像。SRAM (WRAM)是保存内存,用于访问存储保存游戏的内存的地址从$8000开始是分配给插装式PRG-ROM(相当于小霸王那个卡带)的地址。如果游戏只有一个16 KB的PRG-ROM Bank将加载到$8000和$CO00,这是为了确保向量表位于正确的地址;若有两个16kb的PRG-ROM Bank的游戏将一个装入$8000,另一个装入$C000。拥有两个以上Bank的游戏使用内存映射器来确定要将哪些Bank加载到内存中。内存映射器监视特定地址(或地址范围)的内存写入,当写入该地址时,它执行Bank的选择。详细信息在不同的内存映射器之间有所不同,更多信息可以在附录D中找到(这个附录D可以到《任天堂娱乐系统文档》上找)。

CPU内存映射图

 

三、寄存器

注册与类似的处理器相比,6502的寄存器更少。有三个特殊用途的寄存器:程序计数器、堆栈指针和状态寄存器,每个寄存器都有特定的用途。它还有三个通用寄存器,累加器和索引寄存器,X和Y,可以用来临时存储数据或控制信息

(1)程序计数器(PC)

程序计数器是一个16位寄存器,它保存下一条要执行的指令的地址。当指令被执行时,程序计数器的值被更新,通常移动到序列中的下一条指令。该值可能受到分支和跳转指令、过程调用和中断的影响。

(2)堆栈指针(SP)

堆栈位于内存位置$0100-$01FF。堆栈指针是一个8位寄存器,用作$0100的偏移量。堆栈自顶向下工作,因此当将一个字节压入堆栈时,堆栈指针递减,当从堆栈中拉出一个字节时,堆栈指针递增。没有检测到堆栈溢出,堆栈指针将只是围绕在$00到$FF间变动。

(3)累加器(A)

累加器是一个8位寄存器,它存储算术运算和逻辑运算的结果。也可以将累加器设置为从内存中检索的值。

(4)索引寄存器X (X)

X寄存器是一个8位寄存器,通常用作计数器或certair寻址模式的偏移量。可以将X寄存器设置为从内存中检索的值,并可用于获取或设置堆栈指针的值。

(5)索引寄存器Y(Y)

Y寄存器是一个8位寄存器,其使用方式与X寄存器相同,用作计数器或存储偏移量。与X寄存器不同,Y寄存器不能影响堆栈指针。

(6)处理器状态(P)

状态寄存器包含许多位标志,这些标志在执行指令时被设置或清除。

进位标志(C)——如果最后一条指令导致第7位溢出或第0位下溢,则设置进位标志。例如执行255 + 1会导致结果为0同时进位标志(C)置位。这允许系统对数字进行计算时先通过对第一个字节执行计算,存储进位和,然后再对第二个字节执行计算时使用该进位。进位标志可以由SEC(设置进位标志)指令设置,也可以由CLC(清除进位标志)指令清除。

零标志(Z)——如果最后一条指令的结果为零,则设置零标志。例如128 - 127没有设置零标志,而128 - 128设置了。

中断禁用标志(I)——中断禁用标志可以用来防止系统响应irq。它是由SEl (set Interrupt Disable)指令设置的,irq将被忽略,直到执行CLI (Clear Interrupt Disable)指令。

十进制模式标志(D)——十进制模式标志用于将6502切换到BCD模式。但是2A03不支持BCD模式,所以尽管可以设置该标志,但它的值将被忽略。此标志可以设置SED(设置十进制标志)指令并通过CLD(清除十进制标志)清除。

Break命令标志(B)——Break命令标志用于指示BRK (Break)指令已经执行,从而导致IRQ。

溢出标志(V)——如果前一条指令获得了无效的2的补码结果,则设置溢出标志。这意味着当一个正的结果被期望时,一个负的结果已经获得,反之亦然。例如,两个正数相加应该得到一个正数。但是64 + 64的结果是128,这是由符号位决定的。因此,将设置溢出标志。溢出标志是通过取第6位和第7位之间的进位以及第7位和进位标志之间的异或来确定的。

负标志(N)——字节的第7位表示该字节的符号,如果符号为置1该为也会置1。

这些标志按照下图所示的顺序排列在状态寄存器中。状态寄存器的第5位未使用。

状态寄存器

四、中断

中断阻止代码的标准顺序执行,并导致处理器处理中断。中断通常由需要注意的硬件产生。但可以由软件触发。NES有三种不同类型的中断,NMI, IRQ复位。中断向量表存储在$FFFA-$FFFF程序代码中。当中断发生时,系统执行以下操作:

1、识别已经发生的中断请求

2、完成当前执行的指令。

3、将程序计数器(PC)和状态寄存器推入堆栈。

4、设置中断禁用标志以防止进一步的中断。

5、将中断处理函数的地址从向量表加载到程序计数器(PC)中。.执行中断处理函数。

7、在执行RTI(从中断返回)指令后,从堆栈中取出程序计数器(PC)和状态寄存器值。

8、恢复程序的执行。

中断或可屏蔽中断,是由某些内存映射器生成的。如果设置了中断禁用标志,它们将被处理器忽略。通过使用BRK (Break)指令,软件可以触发irq。当发生IRQ时,系统跳转到位于SFFFE和SFFFF的地址。

NMI(不可屏蔽中断)是当V-Blank出现在每个帧的末尾时,PPU产生的中断类型。NMls不受状态寄存器中中断禁用位的影响,所以当它们发生时,程序总是被中断。但是,如果PPU控制寄存器1($2000)的第7位是清除的,则可以防止触发NMI。当一个NMI发生时,系统跳转到位于$FEFA和$FFFB的地址。NMIs的处理如下图所示。

NMI(不可屏蔽中断)处理图

当系统第一次启动或用户按下复位按钮时,复位中断是三联的。当复位发生时,系统跳转到位于$FFFC和$FFFD的地址。系统给予复位请求最高优先级,其次是NMI,最后是IRQ。NES有7个周期的中断延迟,这意味着它需要7个CPU周期来开始执行中断处理器。

 

五、寻址模式

6502有几种不同的寻址模式,提供了访问内存位置的不同方式。还有一些寻址模式是对用户的内容而不是内存进行操作的。在6502上总共有13种不同的寻址模式。有些指令可以使用多种不同的寻址模式。有关可用寻址模式的详细信息可在附录E(这个附录E大家到《任天堂娱乐系统文档》上找,因为十几页的内容比较多)中找到。

六、指令

6502有56条不同的指令,尽管有些指令有多种变体,使用不同的寻址模式,使得在可能的256个有效操作码(操作码)中总共有151个。根据寻址模式的不同,指令的长度可以是1字节、2字节或3字节。第一个字节是操作码,其余的字节是操作数。指令可分为几个功能组。

1、加载/存储操作——从内存中加载寄存器或将寄存器的内容存储到内存中。

2、寄存器传输操作——将X或Y寄存器的内容复制到累加器或将累加器的内容复制到X或Y寄存器。

3、堆栈操作——使用X寄存器或堆栈指针来完成出入堆栈的操作。

4、逻辑操作——对累加器和存储在内存中的值执行逻辑操作。

5、算术运算——在寄存器和内存上执行算术运算。

6、递增/递减——X或Y寄存器或存储在内存中的值的递增或递减。

7、移位——将累加器或内存位置的位向左或向右移动一位。

8、跳转/调用——中断连续的执行序列,从指定的地址恢复。

9、分支——中断连续的执行顺序,如果满足条件,从指定的地址恢复。该条件包括检查状态寄存器中的特定位。

10、状态寄存器操作——在状态寄存器中设置或清除一个标志。

11、系统功能——执行很少使用的功能。

七、参考资料

文章:

《NES DEV wiki》 http://wiki.nesdev.com/w/index.php/CPU

资料链接:

《Nintendo Entertainment System Documentation(任天堂娱乐系统文档)》

《6502汇编指令速查表》

链接:https://pan.baidu.com/s/1QhbK6ADAHqe1mHkKGALH6A  提取码:rr69

原创文章 22 获赞 29 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34254642/article/details/104217290
今日推荐