状态寄存器
状态寄存器的位7,6,3,2,1,0(nvdizc)功能和6502的状态寄存器位相同。
不再需要用B暂停位来检测BRK了,取而代之的是用一个新的硬件向量来像IRQ的方法那样指示代码流程到操作系统的ROM处理器。然而,在模拟模式(E=1)下BRK和B就像在6502中一样工作。
3.21 模拟位E:隐藏位
模拟状态位E表示处理器是在6502模拟模式或原本的65816模式,设置成1表示在模拟模式下。处理器在通电的时候就默认在6502模拟模式下。 在6502模拟模式下,处理器在功能上和6502完全一致。除了6502没有使用的操作码之外,其他操作码都和在真正的6502上一样的执行。在模拟模式下,堆栈被定义为页面1,直接页面被定义成零页面,而且数据存储段和程序存储段字节被设成零。在模拟模式下65816附加的操作码也是可用的。
模拟状态位是一个隐藏的或者虚幻的位,是不能被直接设置,检测或清除的。因此,一个新的指令被用于交换进位标志位和模拟位(XCE:交换进位标志位和模拟位)的值。在交换后,检测进位标志就可以指定E位的原先状态。
切换到原本模式使用下列指令:
clc ;进位标志清零。
xce ;交换进位标志位和模拟位。
要返回到模拟模式使用下面指令:
sec ;进位标志设为1。
xce ;交换进位标志位和模拟位。
3.22 十六位用户寄存器
和6502相比,65816的主要优点是累加器和XY变址寄存器宽度可以在8位和16位之间选择。累加器和XY寄存器的宽度可以独立地进行选择。这样你可能选择以下的任何一种组合:
16位累加器 m=0 16位XY寄存器x=0
16位累加器 m=0 8位XY寄存器x=1
8位累加器 m=1 16位XY寄存器x=0
8位累加器 m=1 8位XY寄存器x=1
无论累加器从16位切换到8位还是从8位切换到16位,累加器的高端字节总是保留的。
当XY寄存器从16位切换到8位时,高端字节(8-15位)会丢失。当XY寄存器切换到16位的时候,高端字节会变成零。
3.23 状态位4(X): 变址寄存器选择
状态寄存器位4选择8位16位的XY变址寄存器操作。当x=1(8位),XY寄存器以和6502的变址寄存器一样的方式工作。
当x=0(16位),X和Y寄存器都变成16位宽。所有X和Y寄存器参与的操作,都在变址寄存器的16位中进行。
当变址寄存器从8位到16位或者从16位到8位切换时,X或Y的高端字节将会被置零。
在模拟模式(E=1)下,位4是B,BRK标志位。
3.24 状态位5: 累加器/内存选择
位5表示是将累加器当做一个8位还是16位寄存器。当在16位模式(m=0)下,所有累加器参与的操作都会在数据的16位上进行。例如,在16位模式下,一个标准的读入操作(lda$1000)会将($1000)读入累加器的低8位而将($1001)读入累加器的高8位。
当累加器从16位切换到8位或从8位切换16位,高端字节完整地被保留。 在8位模式下,累加器的高端字节(B)可以用XBA指令来和低端字节交换。
在模拟模式下,位5不使用。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。