我正在查看 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