为什么操作地址加2?

Gav*_*nes 6 javascript emulation

我正在寻找NES 的Javascript模拟器来尝试理解它是如何工作的.

这一行:

    addr = this.load(opaddr+2);
Run Code Online (Sandbox Code Playgroud)

操作码增加2.但是,我正在阅读的文档(见附录E)说:

零页寻址使用单个操作数,该操作数用作指向零页($ 0000- $ 00FF)中的地址的指针,其中可以找到要操作的数据.通过使用零页寻址,操作数只需要一个字节,因此指令更短,因此执行速度比采用两个操作数的寻址模式更快.零页面指令的示例是AND $ 12.

因此,如果操作数的参数只有一个字节,那么它不应该直接出现在它之后,而是+ 1而不是+ 2?为什么+2?

这就是我认为它的工作方式,这可能是不正确的.假设我们的记忆如下:

-------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | <- index
-------------------------
| a | b | c | d | e | f | <- memory
-------------------------
  ^  
   \ 
     PC
Run Code Online (Sandbox Code Playgroud)

而我们的电脑正0指向a.对于这个循环,我们说操作码:

var pc= 0; //for example's sake
var opcode= memory[pc]; //a
Run Code Online (Sandbox Code Playgroud)

那么第一个操作数不应该是下一个插槽,即b

var first_operand = memory[pc + 1]; //b
Run Code Online (Sandbox Code Playgroud)

HBP*_*HBP 2

乍一看,您的分析似乎是正确的,但既然模拟器可以工作,那么肯定还有其他事情发生。

相关代码如下:

    var opinf = this.opdata[this.nes.mmap.load(this.REG_PC+1)];
    var cycleCount = (opinf>>24);
    var cycleAdd = 0;

    // Find address mode:
    var addrMode = (opinf >> 8) & 0xFF;

    // Increment PC by number of op bytes:
    var opaddr = this.REG_PC;
    this.REG_PC += ((opinf >> 16) & 0xFF);

    var addr = 0;
    switch(addrMode){
        case 0:{
            // Zero Page mode. Use the address given after the opcode, 
            // but without high byte.
            addr = this.load(opaddr+2);
            break;
Run Code Online (Sandbox Code Playgroud)

请注意,在显示的第一行中,获取指令信息的内存访问位于地址REG_PC+1。因此,PC 实际上指向正在执行的操作码之前的字节,因此操作数从该地址 + 2 开始。操作码本身被编码为 的低 8 个字节,opinf并在执行切换中使用,该切换位于所示代码段下方的一个页面左右。