6

私はNESのJavascriptエミュレーターを見て、それがどのように機能するかを理解しようとしています。

この行で

    addr = this.load(opaddr+2);

オペコードは2つインクリメントされます。ただし、私が読んでいるドキュメント(付録Eを参照)には次のように書かれています。

ゼロページアドレッシングは、操作対象のデータを見つけることができるゼロページ($ 0000- $ 00FF)のアドレスへのポインタとして機能する単一のオペランドを使用します。ゼロページアドレッシングを使用することにより、オペランドに必要なバイトは1バイトのみであるため、2つのオペランドを使用するアドレッシングモードよりも命令が短くなり、実行が高速になります。ゼロページ命令の例はAND$12です。

したがって、オペランドの引数が1バイトしかない場合は、その直後に表示して、+2ではなく+1にする必要がありますか?なぜ+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;

示されている最初の行で、命令情報を取得するためのメモリアクセスがアドレスにあることに注意してくださいREG_PC+1したがって、PCは実際には、実行中のオペコードの前のバイトを指しているため、オペランドはそのアドレス+ 2から始まります。オペコード自体は、下の8バイトとしてエンコードされ、opinf表示されているコードセグメントの1ページほど下の実行スイッチで使用されます。 。

于 2012-10-27T06:26:11.360 に答える