我正在寻找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
答案 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字节并用于执行切换所显示的代码段下方的页面。