6

我正在查看 NES 的Javascript 模拟器,以尝试了解它是如何工作的。

这条线上

    addr = this.load(opaddr+2);

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

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

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

这就是我认为它的工作原理,这可能是不正确的。假设我们的记忆是这样的:

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

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

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

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

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

1 回答 1

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;

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

于 2012-10-27T06:26:11.360 回答