シリアル化

Last-modified: 2011-01-26 (水) 18:53:49

シリアル化



v0.1.6から導入されたmulti adress writeを使用することで
既存のコードを短く纏めることが出来る


multi adress write書式

32bit 

0x4aaaaaaa 0xbbbbyyyy
0xdddddddd 0x00000000

アドレスaaaaaaaからbbbb個のアドレスになるように
yyyy*4アドレスずつずらしながら値ddddddddを書き込む

16bit

0x8aaaaaaa 0xbbbbyyyy
0x1000dddd 0x00000000

アドレスaaaaaaaからbbbb個のアドレスになるように
yyyy*2アドレスずつずらしながら値ddddを書き込む

8bit

0x8aaaaaaa 0xbbbbyyyy
0x000000dd 0x00000000

アドレスaaaaaaaからbbbb個のアドレスになるように
yyyyアドレスずつずらしながら値ddを書き込む



魔界戦記ディスガイアポータブル

_C0 MANA 01-10
_L 0x20153000 0x0098967F
_L 0x20153750 0x0098967F
_L 0x20153EA0 0x0098967F
_L 0x201545F0 0x0098967F
_L 0x20154D40 0x0098967F
_L 0x20155490 0x0098967F
_L 0x20155BE0 0x0098967F
_L 0x20156330 0x0098967F
_L 0x20156A80 0x0098967F
_L 0x201571D0 0x0098967F

このコードをよく見るとアドレスの下三桁が
000,750,EA0と+[[750h>Q&A]]になっていることがわかる。
よって、このコードはアドレス0153000から[[750h>Q&A]]アドレスずつずらした
10個のアドレスが並んでるということになるので

_C0 MANA 01-10
_L 0x40153000 0x000A01D4 ※1D4*4=750
_L 0x0098967F 0x00000000

と表すことが出来る


このコードの利点はコードが短くなるだけではなく、例のような場合
bbbbの値がそのまま適用人数となるので、人数が増えたときのコード適用が
容易になる等が挙げられる


ポインターコードのシリアル化

例:みんごる1の風

_C0 WIND DIRECTION 1-9HOLE
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x00000314
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x00000318
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x0000031C
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x00000320
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x00000324
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x00000328
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x0000032C
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x00000330
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020001 0x00000334

アドレスの右下部に注目すると+4hずつ増えているので、このコードは(アドレス4BF1B0に入っている値)-0x8800000+0x314から[[+4h>Q&A]]アドレスずつずらした9個のアドレスが並んでるということになるので,下のようにまとめることが出来る。0x9sssssssのsssssssにはmulti adress writeの32bit時のように(ずれている分,ここでは4)÷4、sssssss=1になる。

_C0 WIND DIRECTION 1-9HOLE
_L 0x604BF1B0 0xvvvvvv00
_L 0x00020009 0x00000314
_L 0x90000001 0x00000000


ポインターアドレスのシリアル化

下のように書き込むbit数,値,オフセットが変わらずポインターアドレスだけが+4hずつずれている場合まとめることができる。1人目のポインターとなりが2人目ポインターになっている時などに使うことができる。
_L 0x6aaaaaaa 0xvvvvvvvv
_L 0xqqq200nn 0x000iiiii
_L 0x90000000 0x00000000
aaaaaaaポインターアドレス,vvvvvvvv書き込む値,qqq=ポインターアドレスのオフセット÷4
nn=何ポインターアドレス分

例:
_L 0x60001000 0xvvvvvvvv
_L 0x00020001 0x0000iiii
_L 0x60001004 0xvvvvvvvv
_L 0x00020001 0x0000iiii
_L 0x60001008 0xvvvvvvvv
_L 0x00020001 0x0000iiii

_L 0x60001000 0xvvvvvvvv
_L 0x00120003 0x0000iiii qqq=4÷4=001
_L 0x90000000 0x00000000