# FF40 - LCDC - LCD制御レジスタ (R/W) ``` Bit 0 背景/ウィンドウの有効/優先度フラグ (1 = オン) DMG: 背景/ウィンドウの有効フラグ CGB: 背景/ウィンドウのマスター優先度フラグ 1 OBJ有効フラグ (1 = オン) 2 OBJサイズ (0=8x8, 1=8x16) 3 背景タイルマップ表示選択 0: 0x9800..9BFF 1: 0x9C00..9FFF 4 背景/ウインドウタイルデータ選択 0: 0x8800..97FF 1: 0x8000..8FFF 5 ウインドウ有効フラグ (1 = オン) 6 ウインドウタイルマップ選択 0: 0x9800..9BFF 1: 0x9C00..9FFF 7 LCD有効フラグ (1 = オン) ``` ## LCDC.0 - 背景/ウィンドウの有効フラグ/優先度 このビットは、ゲームボーイの機種によって意味が異なります。 モノクロモードのときは 背景/ウィンドウの有効フラグ として扱います。このビットがクリアされると、背景もウィンドウも真っ白になり、その場合、ウィンドウ表示フラグ(bit5)は無視されます。ビット1でスプライトの表示が有効なら、スプライトだけは表示することができます。 CGBモードのときは 背景/ウィンドウのマスター優先度フラグ として扱います。このビットがクリアされると、背景とウィンドウはその優先順位を失います。スプライトは、OAMやBGの属性マップの優先度フラグとは無関係に、常に背景やウィンドウの上に表示されます。 ## LCDC.1 - OBJ有効フラグ このビットは、スプライトを表示するかどうかを制御します。 このビットはフレームの途中でも切り替えることができます。例えば、ステータスバーやテキストボックスの上にスプライトが表示されるのを防ぐことができます。 ## LCDC.2 - OBJサイズ このビットは、スプライトのサイズを制御します。 フレームの途中でこのビットを0(8x8)から1(8x16)に変更する場合は注意が必要です。8x8用のスプライトの残骸が8x16ゾーンに漏れて、画面にノイズが生じることがあります。 ## LCDC.5 - ウインドウ有効フラグ このビットは、ウィンドウを表示するかどうかを制御します。 DMGでこのビットがリセットされる場合、ビット0(LCDC.0)の値がセットされます。 このレジスタの値をフレームの途中で変更すると、より複雑な動作が引き起こされます。詳細は[以下](scrolling.md#ff4a---wy---ウィンドウy座標-rw)を参照してください。 CGBモデルでは、フレームの途中でこのビットを0にしてから1に戻すと、2回目の書き込みが無視されることがありますのでご注意ください。 ## LCDC.6 - ウインドウタイルマップ選択 [タイルマップ](./tilemap.md)を参照してください。 ## LCDC.7 - LCD有効フラグ このビットは、LCDがオンであるかとPPUがアクティブであるかを制御します。 0に設定するとLCD,PPUの両方ともオフになり、VRAMやOAMなどにすぐにアクセスできるようになります。 ``` LCD動作の停止(Bit7を1→0)は、VBlank期間中のみ行うことができます。 VBlank期間外にディスプレイを無効にすると、GBの電源を切ったときに表示されるような黒い横線が焼き付いてハードウェアが損傷する可能性があります。 これは深刻な問題のようです。任天堂は、このルールに従わないゲームの販売を認めなかったと言われています。 ``` 表示を無効にすると画面は真っ白になります。 DMGでは色番号0よりも白い色として表示されるようです。SGBでは、画面が白くなるのではなく直前の画面が表示され続けるようですが、正確な挙動についてはまだ調査中です。 LCDを再度有効にすると、PPUはすぐに描画を再開しますが、再開直後のフレームは画面が真っ白になります。