スプライト RAM のバグ
OAM RAM の領域 ($FE00 - $FEFF) に対して次のようなコードを実行すると、表示内容が壊れる原因になります。
inc rr dec rr ;rr = bc,de, or hl
ldi a,(hl) ldd a,(hl)
ldi (hl),a ldd (hl),a
スプライト 1 または 2 ($FE00 または $FE04) は、この影響を受けません。
消費電力の削減
次に示すような方法で、ゲームボーイの消費電力を減らし、バッテリーの持続時間を伸ばすことができます。
HALT 命令の使用
HALT 命令を使用することで、消費電力を減らすことができます。
この命令は、システムクロックを停止させ、 CPU と ROM の消費電力を減らします。
CPU がサスペンドされている間に割り込みが発生すると、
割り込み処理の後すぐに、 HALT 命令の次の位置から実行が再開されます。
CPU 時間がゲームによってどれくらい必要とされるかによりますが、
HALT 命令を使うことによって、バッテリーを 5% から 50% 伸ばすことができます。
VBlank イベントを待っている間のコード例として、次のように書くと良くありません。
@@wait:
ld a, (0FF44h) ;LY
cp a, 144
jr nz, @@wait
良い例としては、次のようになります。
この例では、VBlank 割り込みが有効になっている必要があります。
また、割り込み中に vblank_flag を 0 以外の値にセットしなければなりません。
ld hl, vblank_flag ;hl = vblank_flag へのポインタ
xor a ;a = 0
@@wait: ;待つ処理...
halt ;CPU をサスペンドする - 何らかの割り込みが発生するのを待つ
cp a, (hl) ;vblank flag は 0 のままかチェックする
jr z, @@wait ;0 の場合はさらに待つ
ld (hl), a ;vblank_flag を 0 に戻しておく
vblank_flag 変数の値を、 VBlank 割り込み内でのみ変更するようにすることで、
他の割り込みによって HALT の処理を中断させられることがないようにできます。
上の例で、他の割り込みを全て禁止した場合は、 HALT 命令を 1 つ書くだけの処理へ置き換えることができます。
STOP 命令の使用
STOP 命令はゲームボーイをすごく消費電力の少ない状態に切り替えます。
例えば、この機能を使うとキー入力を長い時間、検知しなくなります (ゲームボーイの電源を切ってしまう人も居そうなくらい)。
STOP 命令の呼び出し前に、画面表示やサウンドを停止する必要があるかもしれません (ゲームボーイカラーでは赤外線ポートも同様に)。
HALT と同様に、 STOP 状態も割り込み処理を行うことができます。 STOP の場合、通常キー入力割り込みが使われます。
STOP 命令の呼び出し前の準備時に、キー入力用レジスタも準備する必要があるかもしれません。
サウンドコントローラの停止
サウンドを使わない場合、もしくは使わない期間がある場合、 FF26 の IO レジスタに 00h を書き込むことで 16% 以上の消費電力を減らすことができます。
同じレジスタに 80h を書き込むと、サウンドがまた有効になります。その時、すべてのサウンド用レジスタを再度、初期化する必要があります。
ゲームボーイの電源が ON になった時、サウンドはデフォルトで有効になります。無効にする場合は、手動で停止する必要があります。
ゲームボーイカラーの倍速モードを使用しない
ゲームボーイカラーの倍速モードは消費電力を増やすため、できる限り通常スピードで実行した方が良さそうです。
倍速モードの切り替えには制限があります。例えば、タイトルスクリーンでは通常スピード、ゲーム内では倍速、またはその逆にするというような感じです。
速度の切り替え時に、少しの間、画面の表示内容が壊れることがあるため、ゲーム中や、タイトル画面の表示中には切り替えない方が良さそうです。
技術を使う
効率的で短いアセンブリコードを書くと、 CPU の消費電力も同様に少なくて済みます。
最終更新:2017年08月28日 12:11