最新の10件
ページ | 日付 |
---|---|
en:guid:febuildergba:work_support | 2023/06/08 20:25 |
guide:febuildergba:作品支援 | 2023/06/08 20:24 |
最新の10件
ページ | 日付 |
---|---|
en:guid:febuildergba:work_support | 2023/06/08 20:25 |
guide:febuildergba:作品支援 | 2023/06/08 20:24 |
FE8から導入された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は、メモリスロットが導入されたので、構造体を使わずに、イベント命令から直接コードを書くことが出来ます。
複雑にはなりましたが、汎用性は増えました。