トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

MemorySlot

Last-modified: 2018-02-25 (日) 12:45:43 (88d)

FE8から導入されたMemorySlotについて

MemorySlot

MemorySlotは、レジスタのようなものです。
0x00-0x0Dまであります。サイズは各自4バイトです。

名前役割FE8JアドレスFE8Uアドレス
MemorySlot0書き込み禁止 常に0にする必要がある030004B0030004B8
MemorySlot1データの受け渡しで使われることがある030004B4030004BC
MemorySlot2データの受け渡しで使われることがある030004B8030004C0
MemorySlot3030004BC030004C4
MemorySlot4030004C0030004C8
MemorySlot5030004C4030004CC
MemorySlot6030004C8030004D0
MemorySlot7比較用のテンポラリとして使われることが多い030004CC030004D4
MemorySlot8030004D0030004D8
MemorySlot9030004D4030004DC
MemorySlotA030004D8030004E0
MemorySlotB主に座標が読みこまれるのに利用されます030004DC030004E4
MemorySlotC主に処理の結果が返されます030004E0030004E8
MemorySlotDキューの最大値030004E4030004EC

値を取得した、比較する、条件系の命令は、メモリスロットに結果の値を返します。(主にMemorySlotCが利用されます)
比較命令は、メモリスロットに対して行われます。

実際の命令を見てみる

序章で、敵が1体になると、ゼトがつぶやきます。

24190000	//CHECK_ENEMIES   残り敵数を取得して MemorySlotCに格納
4005070001000000410C00000C000700	//BNE(Jump to ConditionID label when !=,else execute the following)[ConditionID:0x0][Value:0x1] 
           //2つの命令から成り立っています。分解してみましょう。
           //4005070001000000    //MemorySlot7に1を代入
           //410C00000C000700    //BNE MemorySlotC,MemorySlot7 の比較
           //                    //つまり、残りの敵数と、1を比較します
           //                    //if (残り敵数 != 1) { goto labelC; }
           //                    //else{ 以下を実行します
213B0200200E3C00223B0000	//[frame seconds:60][Character:0x2 ゼト]  //ゼトにフレームをあわせて
201A0000201BD308201D0000221B0000	//Conversation event [conversation text:0x8D3 これで 残るは敵将のみ・・・] //彼がつぶやく
//以下省略

キューについて

複雑な移動命令や、イベント戦闘などは、設定値がたくさん必要になるので、
値をキューに積んで渡されます。

キューというよりもスタックに近いです。

キューを利用する時は、MemorySlotD(キューの最大値)に 0 を代入して、既存のキューを消します。
その後で、メモリスロットに値を書き込んで、SAVETOQUEUE命令で、キューに push します。
SAVETOQUEUEされるたびに、キューが伸びるので、 MemorySlotDが自動的に更新されます。
スタックレジスタみたいですね。

キューは、MemorySlotD+4のアドレスからアドレスに存在します。

名前FE8JFE8U
キュー0030004E8030004F0
キュー1030004EC030004F4
.........

いくつまであるかは資料がありませんでした。

実際の命令を見てみる

オープニングイベントで、フランツがゼトと一緒に去っていく命令です。

40050D0000000000400501000C0100002107000040050100000000002107000040050100CC02000021070000400501000000000021070000432F00000400000020300000 //Move Setting And Move immediately [UNIT:Character] to [EVENTUNITPOS:coordinate 1] to [EVENTUNITPOS:coordinate 2]

//まとめられているので、命令ごとに分解してみましょう
//40050D0000000000 //MemorySlotDに 0 を設定   キューの個数を0で初期化する
  400501000C010000 //MemorySlot1に 座標を設定 y<<6 | x
  21070000         //SAVETOQUEUE  キューに詰む命令
  4005010000000000 //MemorySlot1に セパレータ用の0を設定する
  21070000         //SAVETOQUEUE  キューに詰む命令
  40050100CC020000 //MemorySlot1に座標を設定 y<<6 | x
  21070000         //SAVETOQUEUE  キューに詰む命令
  4005010000000000 //MemorySlot1に セパレータ用の0を設定する
  21070000         //SAVETOQUEUE  キューに詰む命令
  432F000004000000 //ユニットID:4 フランツに複雑な移動を設定する
  20300000         //移動設定した命令を実行する

メモリスロットが導入される前の作品である FE7 では、 こういう情報を構造体に保持して、その構造体へのポインタを指定していました。
FE8は、メモリスロットが導入されたので、構造体を使わずに、イベント命令から直接コードを書くことが出来ます。
複雑にはなりましたが、汎用性は増えました。