为什么操作地址加2?

时间:2012-10-27 03:13:31

标签: javascript emulation

我正在寻找NES的Javascript emulator来尝试了解它是如何工作的。

this line上:

    addr = this.load(opaddr+2);

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

  

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

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

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

-------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | <- index
-------------------------
| a | b | c | d | e | f | <- memory
-------------------------
  ^  
   \ 
     PC

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

var pc= 0; //for example's sake
var opcode= memory[pc]; //a

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

var first_operand = memory[pc + 1]; //b

1 个答案:

答案 0 :(得分: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;

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