2013-06-02 79 views
1

我正在爲6502寫一個模擬器,基本上,有一些指令,其中一個寄存器(主要是X和Y)保存偏移量,我想知道,因爲分支指令使用帶符號的8位整數,寄存器的值是否保持爲8位?這意味着:6502使用帶符號或無符號8位寄存器(JAVA)嗎?

switch(opcode) { 
    //Bunch of opcodes 
    case 0xD5: 
    //Read the memory area with final address being address + x offset 
    int rempResult = a - readMemory(address + x); 
    //Comparing some things, setting/disabling flags 
    //Incrementing program counter and cycles/ticks 
    break; 
    //More opcodes 
} 

假設在這種情況下x = 0xEE。在普通的二進制中,這意味着x = 238.然而,在6502中,分支指令使用帶符號的偏移量跳轉到內存地址,所以我想知道,在這種情況下是238解釋爲-18還是僅僅常規無符號8位值?

+0

寄存器保存8位數據。它既不簽名也不簽名。每個教學都要決定如何解釋它。相對跳轉將其解釋爲已簽名。 –

+0

這不是真正的「相對跳躍」。這是一個零頁面,X「比較累加器」指令。它將累加器與一些值進行比較並相應地設置標誌。事情是,用Zero Page,X(或任何...,X指令),它們被解釋爲有符號還是無符號?而「他們」是指寄存器。 – ZimZim

回答

4

它有所不同。

他們沒有明確的符號或無符號算術,邏輯,移位,或者加載和存儲操作。

的條件分支(以及在後面6502個後代無條件一個)一切以參數作爲簽署;否則循環會非常尷尬。

zero, x尋址通過執行一個8位加法x與零頁地址,而忽略進位,並從零頁讀取來實現。所以例如

LDX #-126 ; which is +130 if unsigned 
LDA 23, x 

將可能從地址讀取23 + 130 = 153,但它當時223 + 130,然後結束讀會一直從(223 + 130)MOD 256 = 97

absolute, x/y沒有符號, (但花費額外的週期)

(zero, x)非常類似於直接版本,其中偏移量是有符號的,但結果總是在零頁內。然後從那裏讀取真實地址。

(zero), y是無符號與攜帶的工作和成本。

+0

好的,我的腦海裏清楚了。要使用Zero,x,我根本無法使用負值,因爲它們在任何時候都應該是正值(即,所有有符號值都隱含地轉換爲它們的二進制補碼無符號值對應值)。這同樣適用於絕對值,x/y。但是,零點x可以使用負值,所以如果偏移量> 127,那麼偏移量將從地址中減去。或者我誤解了? – ZimZim

+0

不,這是如果你在C中,你可能會表達它有點像'uint8_t zeroAddress = byteJustRead + x;結果=內存[zeroAddress];'。我猜在Java中可以等效地表示爲char charAddAddress =(byteJustRead + x)&0x00ff; result = memory [zeroAddress];',即所以你只保留結果的低8位(假設我記得'char'是Java中的無符號16位類型是準確的)。所以它是無符號的加法,但最終可能會得到較低的值。 – Tommy

+0

說實話,在我的6502仿真器上工作多一點(現在我大部分都在工作),我終於完全理解了這個答案。謝謝。 – ZimZim

0

的「符號」是一個簡單的最顯著(又名位7)在一個8位字節的值。

6502在這些方面有符號價值的支持:

  • N.P - 但它確實只是告訴你,如果最後的指令開啓或關閉一個內存位置的第7位或註冊。通常使用BPL/BMI在內存位置根據位7使用標誌或「boolean」來使用。
  • V位的.Pflipped「時增加兩個正數溢出的結果,並且結束了負的,並且當添加兩個負數溢出的結果,並且結束正」
  • 當然,服從符號僅用於相對分支指令,例如BEQ帶有位7的值將移動到較低的內存位置,而不是較高的位置。

除此之外,是否意味着任何事情完全取決於您和您的計劃。真正使數字有符號或無符號的是你如何顯示數字。

上面的鏈接文章進入了什麼是補碼和二進制補碼,以及它如何使數學工作沒有6502不必太多關於標誌。

相關問題