57438
NES(ファミコン)のエミュレーターを作っているのですが  
BIT命令のオーバーフローフラグの処理がわかりません。  
このneschanというエミュレータの実装ではvalと0x40の論理積をとっているのですが、なぜ、この処理でオーバーフローが分かるのでしょうか?  
[GitHub neschan
BIT命令の実装](https://github.com/yizhang82/neschan/blob/aac2c7ee6fbf8d1afb3826f2c6fb36b10759664b/lib/src/nes_cpu.cpp#L893)  
[BIT命令の内容](http://www.6502.org/tutorials/6502opcodes.html#BIT)
CC BY-SA 4.0
2019-08-19T03:47:39.130
57436
2019-08-19T04:30:30.037
5246
question
c++
ファミコンのBIT命令のオーバーフローフラグ
**「オーバーフローが分かる」** のではなく、 **「指定されたアドレスのメモリの6ビット目がオーバーフローフラグに設定される」**
という動作になっています。

`フラグ`はステータスレジスタやフラグバイトと呼ばれる8bitのレジスタの各ビットの内容で、その6ビット目(0x40)がオーバーフローフラグ(V
フラグ)です。

質問の[BIT命令の内容](http://www.6502.org/tutorials/6502opcodes.html#BIT)に合致した処理です。

> BIT sets the Z flag as though the value in the address tested were ANDed
> with the accumulator. The S and V flags are set to match bits 7 and 6
> respectively in the value stored at the tested address.
>
> BITは、テストされたアドレスの値がアキュムレータとAND演算されたかのようにZフラグを設定します。
> SおよびVフラグは、テストされたアドレスに格納されている値のビット7および6にそれぞれ一致するように設定されます。

[NES研究室 - 6502](http://hp.vector.co.jp/authors/VA042397/nes/6502.html)

> ステータスレジスタの詳細  
>
> 8bitのレジスタで、1ビット毎に違う意味を持っています。それぞれのビットはCPUが命令を進めるごとに自動的に変化しますが、フラグを手動で設定する命令もあります。  
>  それぞれのビットの状態に応じて分岐する命令が用意されています。
>
> 位置 記号 名前 内容  
>  7 N ネガティブ Aの7ビット目と同じになります。負数の判定用。  
>  6 V オーバーフロー 演算がオーバーフローを起こした場合セットされます。  
>  5 R 予約済み 使用できません。常にセットされています。  
>  4 B ブレークモード BRK発生時はセットされ、IRQ発生時はクリアされます。  
>  3 D デシマルモード セットすると、BCDモードで動作します。(ファミコンでは未実装)  
>  2 I IRQ禁止 クリアするとIRQが許可され、セットするとIRQが禁止になります。  
>  1 Z ゼロ 演算結果が0になった場合セットされます。  
>  ロード命令でも変化します。  
>  0 C キャリー キャリー発生時セットされます。

[ステータスレジスタ -
Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF#6502)

> 6502  
>  6502のステータスレジスタのサイズは8ビットであり、フラグバイトと呼ばれた。
>
> -Bit 7. ネガティブフラグ：演算結果の正負を示す。  
>  ただし、6502の演算結果は常にAレジスタに格納されるため、  
>  結局はAレジスタのMSBを示している。  
>  -Bit 6. オーバーフローフラグ：演算結果が符号付き8ビットで表せる範囲を超えたことを示す。  
>  -Bit 5. 未使用。常に1。  
>  -Bit 4. ブレークフラグ：BRK割り込み発生を示す。  
>  6502にはBRKとIRQの二種類の割り込みがあり、それを識別するためのフラグである。  
>  -Bit 3. デシマルフラグ：セットするとBCDモードで動作する。  
>  -Bit 2. インタラプトフラグ：セットすると割り込みが禁止される。  
>  -Bit 1. ゼロフラグ：演算結果が 0 の時にセットされる。  
>  -Bit 0. キャリーフラグ：キャリー発生時およびボローが発生しなかった時にセットされる。
CC BY-SA 4.0
2019-08-19T04:21:59.410
57438
2019-08-19T04:21:59.410
26370
57436
answer
6502のステータスレジスタ（フラグレジスタ）の７ビット目がオーバーフロー（V）だからでしょう。  
[NES研究室というサイトの6502のページ](http://hp.vector.co.jp/authors/VA042397/nes/6502.html)
CC BY-SA 4.0
2019-08-19T04:30:30.037
57440
2019-08-19T04:30:30.037
31146
57436
answer