2017-07-30 4 views
0

私の6502/NESエミュレータのための命令関数を作成している間、私は符号付きバイトと2の補数のコンセプトを6502で理解しています。つまり、BMIなどの分岐命令は、負の数で算術演算を行う命令もあります。また、負のフラグは、アキュムレータの7番目のビットを検出します。 (2の補数)6502メモリに格納されたバイトは符号付きか符号なしですか?

これは、メモリ内のすべてのバイトが符号化されていて、メモリをint8_t CPUMEMORY[0x10000];として初期化でき、uint8_t CPUMEMORY[0x10000]ではないことを意味しますか?

私が気にしていることは、演算結果が符号なし8ビットの制限255を超えたときにキャリーフラグがセットされるということです。しかし、すべてのバイトが署名されていれば127であるべきではありませんか? (オーバーフローフラグはこれを行いますが、キャリーフラグを持つポイントは何ですか?)

答えて

3

メモリ内のバイトは、符号付きでも符号なしでもありません。ただし、バイトの値は符号付き数値(int8_t)または符号なし数値(uint8_t)として解釈できます。 2つの連続するバイト(int16_tまたはuint16_t)の値と4つの連続するバイト(int32_tまたはuint32_t)の値についても同じです。

これらのバイトを処理するには、6502命令がいくつかあります。これにより、符号付きおよび符号なしの解釈のためにいくつかの演算を実行できます。適切な指示を使用して、必要な作業に適切なフラグ(キャリー、オーバーフロー、ネガ...)を使用するだけです。

+0

バイトを符号なしと符号付きの両方として解釈する命令のADCとSBCの例はありますか?それとも他のものがありますか? –

+1

実際、加算または減算のオペランド/結果を符号付きまたは符号なしとして解釈することができます。 –

+0

完全性のために:**いくつかの**命令では、6502のバイトをBCDと解釈することさえできます。 –

1

キャリーは、(とりわけ)マルチバイト演算に使用されます。

これらのトピックは何百回も書かれているので、私はただgood sourceを引用します。 2の補数の

1.2 REVIEW(符号付き)NUMBERS

バイトのための256個の可能な値が存在します。 16進数では、$ 00〜 $ FFです。 8ビットの符号なし数の範囲は0($ 00)〜255($ FF)です。 16ビット符号なし数値の範囲は0($ 0000)〜65535($ FFFF)、 などです。それらはゼロまたは より大きい、すなわち(マイナス)記号がないので、符号なし数値と呼ばれます。他の ハンドの符号付き数値は、負または正(またはゼロ)にすることができます。 「符号付き番号」という用語は、以下では2つの補数を意味するために使用されています(ただし、符号付き数値を表現するその他の方法は です)。 8ビットの 符号付き数値の範囲は-128〜127です。-128〜-1の値は、それぞれ16進数で $ 80〜$ FFです。値0〜127は、それぞれ16進数で $ 00〜$ 7Fです。したがって、符号付きの数値の最小値は です。符号付きの数値の最大値は$ 7Fです。 16ビット符号付き数値の範囲は-32768($ 8000)〜32767($ 7FFF)です($ 8000〜 $ FFFFは負の数です)。これは、負の数を処理する奇妙な方法のように思われるかもしれませんが、このメソッドにはいくつかの便利なプロパティがあります。

まず、0〜127かかわらず 数は符号付きまたは符号なしされているか否かのヘクスである(符号付き8ビットと 符号なし数値の範囲のオーバーラップ)、$ 00 $ 7F、。

第2に、数値が負でない場合(0から127)、数字が で負の場合は、 はゼロです。実際、これは6502のN(負の)フラグが という名前になった方法です。 (Nフラグは命令の影響を受けたときに がその命令の結果のビット7を反映していることに注意してください)。 の数学では、ゼロはポシティブまたは負の数ではありませんが、 コンピュータの世界では、物事はあまり形式的ではない。 「正の数」という用語は、0を含むのが普通である。なぜなら、(a)符号化された番号の他の全ての可能な値の全てが0,235,164,の正数であり、(b)符号なし 数字は正の数です。

第三に、以下の追加を検討:

CLC 
LDA #$FF 
ADC#$01 

結果(アキュムレータ内)を$ 00で、キャリーが設定されています。 は、符号なしの数値で、255 + 1 = 256です(桁上げ が設定されていることに注意してください)。符号付きの数値は-1 + 1 = 0です。他の ワードでは、符号付きの数値の加算(および減算)は、符号なしの数値の加算(および減算)とまったく同じです。

6502.org sign and the overflow flagについての詳細な説明もあります。

関連する問題