2012-10-27 73 views
6

我正在查看NES的Javascript emulator,試圖瞭解它是如何工作的。爲什麼操作地址增加2?

this line

addr = this.load(opaddr+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 

,我們的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

@PlatinumAzure個人電腦是16位,我認爲操作碼是8位 –

+0

我認爲@PlatinumAzure是在正確的軌道上。另外是跳過操作碼以獲得單字節操作數。 –

回答

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個字節,並用於執行切換一頁左右代碼段顯示。

+0

感謝您的驗證,即使這是唯一的答案;-)僅供參考,您突出顯示的情況是不尋常的。 PC通常指向當前指令或下一條指令。這是我第一次看到當前指令的一點。 – HBP

+0

如果你不介意,我有一個後續問題。不應該在'this.REG_PC'直接讀取操作碼,而不是+1? Thankyou –

+0

我沒有追溯所有的邏輯,但實質上只是一致性的問題。 PC值小於當前指令的值是不常見的,並且相當混亂,但是如果PC值是**總是**小於執行的指令的一個值,並且您在**所有**中說明了這一點PC中的情況比所有參考都要好。 – HBP

相關問題