K3の住民

最近レア社のことをほとんど書いていない自称レア社好きがゲームやプログラミングについて色々書いていく。

【ムジュラ3D】ムジュラ3Dで使われるCPU内部のタイマについて

皆さん、こんにちは。雪圀です。

今回はムジュラ3Dで使われている3DSに内蔵されているタイマについて書いていこう
と思います。


まずこのタイマは、ゲーム内で動いているわけではなく、CPU内部のタイマ
モジュールが独立して動いています。つまりゲーム内で処理落ちが起きていても
このタイマは独立しているので動き続けている状態となっているのです。

そして基本的なCPUのタイマには以下のレジスタがあります。

  • 最大サイクル数をセットするレジスタ
  • タイマを有効/無効化するレジスタ
  • 現在のサイクル数が格納されているレジスタ
  • タイマが最後までカウントアップ/ダウンしたフラグの管理レジスタ
  • (タイマ割込みを有効化するレジスタ

タイマ割込みを有効化するレジスタはある場合とない場合があります。その場合、
割込み前提である場合がほとんどです。

処理落ちが起きても1秒ごとに変数がインクリメントされていっていることからタイマ
割込みが使われていると思われます。

タイマのスタート手順

まずタイマに最大サイクル数をセットします。
ムジュラ3Dは268MHzで動作しているので、おそらく格納されるの0xFF95AFFといった
ところでしょう。

次にタイマを有効化させて(タイマ割込み有効化は省略)、タイマをスタートさせ
ます。

基本的なタイマはこれだけで動かすことができて、あとはこまごまとした設定がある
って感じですかね。

現在のサイクル数

基本的なタイマモジュールではこの現在のサイクル数が最大サイクル数までイン
クリメントされるか、0になるまでデクリメントされます。

この現在のサイクル数が最後までインクリメント/デクリメントされることにより
タイマのフラグがONになります。

HOMEボタンを押す

3DSのHOMEボタンを押すとタイマは停止します。そのためにはタイマを無効化する
必要があります。

通常であれば、再開するときタイマはまた最初から開始するのですがムジュラ3Dの
場合、現在のサイクル数or残りのサイクル数から開始します

おそらく現在のサイクル数(アップカウンタの場合、最大サイクル数から現在の
サイクル数を引いた値)をタイマの最大サイクル数として設定しているのだと
思われます。

そして1フレームHOMEバッファをすると0.25秒サイクルが進むことが判明しました。
つまり4回HOMEバッファをすると1秒になります

なぜこうなるのかというと、HOMEボタンを押して停止/再開するまでにタイマの
サイクルが進んでしまう
ためです。

これが何を意味するのかというと、HOMEボタンを押すと余分にカウントされる
いうことです。

まとめ

ムジュラ3DではCPU内部のタイマはこのように扱われています。

  • HOMEボタンを押すと、現在のサイクルor残りのサイクル数を最大サイクル数と
    してセットし、タイマを無効化してタイマを停止する
  • HOMEボタンで1Fずつ送ると0.25秒ずつサイクルが進む
    • つまり余分にカウントされる。


以上です。HOMEバッファによってタイマはどうなるのかという検証は以下の発想
を元に行いました。

ここからムジュラ3Dのタイマは途中で停止してもちゃんと1秒ずつ送られるような
仕組みになっていることが判明しました
し、どのタイミングでタイマを有効化して
いるのかも大体わかりました

やはりムジュラ3Dは奥が深いなぁ・・・。

今回はこれくらいにしときます。