FE8から導入されたMemorySlotについて ====== MemorySlot ====== MemorySlotは、レジスタのようなものです。\\ 0x00-0x0Dまであります。サイズは各自4バイトです。\\ |名前|役割|FE8Jアドレス|FE8Uアドレス| |MemorySlot0|書き込み禁止 常に0にする必要がある|030004B0|030004B8| |MemorySlot1|データの受け渡しで使われることがある|030004B4|030004BC| |MemorySlot2|データの受け渡しで使われることがある|030004B8|030004C0| |MemorySlot3| |030004BC|030004C4| |MemorySlot4| |030004C0|030004C8| |MemorySlot5| |030004C4|030004CC| |MemorySlot6| |030004C8|030004D0| |MemorySlot7|比較用のテンポラリとして使われることが多い|030004CC|030004D4| |MemorySlot8| |030004D0|030004D8| |MemorySlot9| |030004D4|030004DC| |MemorySlotA| |030004D8|030004E0| |MemorySlotB|主に座標が読みこまれるのに利用されます|030004DC|030004E4| |MemorySlotC|主に処理の結果が返されます|030004E0|030004E8| |MemorySlotD|キューの最大値|030004E4|030004EC| 値を取得した、比較する、条件系の命令は、メモリスロットに結果の値を返します。(主に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のアドレスからアドレスに存在します。\\ |名前|FE8J|FE8U| |キュー0|030004E8|030004F0| |キュー1|030004EC|030004F4| |...|...|...| いくつまであるかは資料がありませんでした。\\ ===== 実際の命令を見てみる ===== オープニングイベントで、フランツがゼトと一緒に去っていく命令です。\\ 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は、メモリスロットが導入されたので、構造体を使わずに、イベント命令から直接コードを書くことが出来ます。\\ 複雑にはなりましたが、汎用性は増えました。\\