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は、メモリスロットが導入されたので、構造体を使わずに、イベント命令から直接コードを書くことが出来ます。\\ 複雑にはなりましたが、汎用性は増えました。\\