2013-05-30 34 views
4

我正在製作一個6502模擬器,並且我在開始時(實現ADC操作)已經卡住了(或者我認爲我至少)。問題是我必須確定是否有進位或溢出。事情是,我無法真正掌握它們在實施中的差異。我知道進位是在操作後出現第9位時,我知道當結果大於255時會發生溢出。這不是確定進位與溢出標誌是否相同嗎?確定Java中的6502仿真中的進位和溢出標誌?

if(result > 255) { 
    carry = 1; 
    overflow = 1; 
} else { 
    carry = 0; 
    overflow = 0; 
} 

這是不正確的?如果不是,什麼是正確的,爲什麼?

+0

http://www.righto.com/2012/12/the-6502-overflow-flag-explained.html – arcy

+0

謝謝。我撇清了這個事情,因爲我現在沒有時間詳細閱讀它,而這正是我所理解的。基本上,我對運載是正確的。如果結果高於255,則有進位。當有一個加法並且數字是負數,或者有一個減法並且數字是正數時,會出現溢出(使用8位有符號字節時)。這是正確的,還是我錯過了什麼?無論如何,謝謝,明天我會更加註意。 – ZimZim

+4

IMO,如果您沒有時間詳細閱讀它,那麼您沒有時間對仿真器進行編程。模擬器是關於細節的,它是單調乏味且耗時的,沒有任何大的捷徑。 – arcy

回答

10

溢出標誌指示號碼的符號何時改變不正確。所以如果你添加兩個正數並得到一個負值就會出現溢出。如果添加兩個負數並獲得肯定結果,也會出現溢出。

添加兩個不同符號的數字時不能溢出,因爲範圍不允許。最小的正值加上最大的負值是0 +(-128),它適合於很好的0,加上8比特的任何東西都明顯適合8比特。最小的負數加上最大的正數是-1 + 127 = 126。哪個適合。

(編輯:甚至與進位,0 + -128 + 1 = -127,這適合,和-1 + 127 + 1 = 127,其適合)

所以溢流設定如果兩個具有輸入同一個符號會產生一個不同符號的結果。否則很明顯。

您可以將其表示爲對符號位進行簡單的按位運算。假設你有一個+ b = c。

a^b 

如果符號不同,符號位將有1。你想知道相反的。因此:

~(a^b) 

如果符號相同,則在符號位中給出1。這是涵蓋測試的第一部分。假設a和b具有相同的符號,您可以對其中任何一個進行測試。這個時候你要測試的差異,因此這只是:

a^c 

您需要的測試位在測試的兩個部分進行設置,這樣你就可以將那些具有二進制和(留下很多括號在鏈接的文字推理):

(~(a^b))&(a^c) 

你只需要符號位,所以屏蔽掉的是:

(~(a^b))&(a^c)&0x80 

這會對其進行評估,以0x00如果溢出標誌應該是CL耳朵和0x80如果應該設置。所以只需轉移到位。 (另一方面:儘管在6502批量的指令集標誌中只有一個暴露了狀態寄存器,所以仿真器經常將標誌分開保存在任何方便的表格中,並按需組成狀態寄存器,在這種情況下,您不會麻煩轉移和撰寫,你只是存儲該結果)

+0

好主意湯米。 – alex