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

MemorySlot の変更点


#author("2018-02-25T12:40:53+09:00","","")
#author("2018-02-25T12:45:43+09:00","","")
FE8から導入されたMemorySlotについて

*MemorySlot [#h981c9b1]
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が利用されます)~
比較命令は、メモリスロットに対して行われます。


**実際の命令を見てみる [#xc99163e]

序章で、敵が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 これで 残るは敵将のみ・・・] //彼がつぶやく
 //以下省略


*キューについて [#q1adb9cc]

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

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

キューを利用する時は、MemorySlotD(キューの最大値)に 0 を代入して、既存のキューを消します。~
その後で、メモリスロットに値を書き込んで、SAVETOQUEUE命令で、キューに push します。~
SAVETOQUEUEされるたびに、キューが伸びるので、 MemorySlotDが自動的に更新されます。~
スタックレジスタみたいですね。~
~
キューは、MemorySlotD+4のアドレスからアドレスに存在します。~
|名前|FE8J|FE8U|
|キュー0|030004E8|030004F0|
|キュー1|030004EC|030004F4|
|...|...|...|

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

**実際の命令を見てみる [#d799c6c8]

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