その他

スプライト 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