DQ6 Extended(拡張ベースパッチ)作成にあたっての考慮点4

一応しこしこと作業は続けていて、ようやく一番の難関と思われた「アイテムの9bit化」が大体終わりました。これによりアイテムをあと128個定義できるようになります。さすがに作業とエントリの更新を同時にやるのは無理ということがわかったのでエントリの投下はしばらく後回しにしています。また、すでに終わっていると思っていた「モンスターの9bit化」はこの作業の途中で8bitだった部分があったのを見つけたので、アイテムの9bit化についてもまだ完全に終わっているとは思えませんが、見つけ次第順次潰していくことにします。作業の進行度合いとしてはようやく作業がひと通り終わったのでこれからテストプレイをするところです。気になるのは仲間の数を増やすことを視野に入れた変更で、職業熟練度と呪文特技習得状態の情報を一応空いていると思われる場所のメモリを見つけてそこに割り当てたのですがそこが果たして本当に使われていないかどうかが確信が持てないことです。こまめに情報が書き換わっていないかチェックをしながらのテストプレイになりそうです。

さて、アイテム9bit化に際して、ここしばらくやっていたのは以下のような作業でした。

  • SR: $04584C 袋にアイテム追加
04584CCLCc=off
04584DPHPPush P Flag
04584EPHBPush DB
04584FSEIi=on
045850REP #$30m=off(A/M:16b) x=off(X/Y:16b)
045852PHAPush A
045853PHXPush X
045854PHYPush Y
045855SEP #$30m=on(A/M:8b) x=on(X/Y:8b)
045857LDY #$01Y=#$01
045859JSL $C426CBSR: $0426CB引数をYバイト取得
04585DLDA #$7EA=#$7E
04585FPHAPush A
045860PLBPull DB
045861LDA $4898A=$4898
045864JSL $C426E0SR: $0426E0引数解釈
045868CMP #$00A==#$00?アイテムIDが0なら何もしない
04586ABEQ #$0Cif(z==on) goto $045878
04586CTAXX=A
04586DLDA $3F0A,XA=$3F0A+X
045870CMP #$63A>=#$63?袋の中のアイテム数を99個でクリップする
045872BCS #$09if(c==on) goto $04587D
045874INCA++
045875STA $3F0A,X$3F0A+X=A
045878REP #$30m=off(A/M:16b) x=off(X/Y:16b)
04587ABRL #$DC2Agoto $0434A7
04587DLDA $08,SA=Stack($08)
04587FORA #$01Aor=#$01
045881STA $08,SStack($08)=A
045883BRA #$F3goto $045878

このSRは引数の場所の値(FF:Aレジスタ、FE:Xレジスタ、FD:Yレジスタ、それ以外DP(XX))をアイテムIDとして取得しアイテムID-1の箇所の数値を1増やす(99でクリップ)する、というものです。問題の箇所は$045868~$045875のあたりで、M,XフラグがONになっているために$045868でAレジスタにセットした値、$04586CでXレジスタにセットした値が1バイトでしか扱われないというものです。アイテム数を255以上にするためにはこの部分を2バイト化する必要があります。

  • SR: $04584C 袋にアイテム追加(2バイト化後)
04584CCLCc=off
04584DPHPPush P Flag
04584EPHBPush DB
04584FSEIi=on
045850REP #$30m=off(A/M:16b) x=off(X/Y:16b)
045852PHAPush A
045853PHXPush X
045854PHYPush Y
045855LDY #$0001Y=#$0001
045858JSL $C426CBSR: $0426CB引数をYバイト取得
04585CLDA #$7E7EA=#$7E7E
04585FPHAPush A
045860PLBPull DB
045861PLBPull DB
045862LDA $4898A=$4898引数解釈
045865AND #$00FFA&=#$00FF
045868JSL $C426E0SR: $0426E0
04586CCMP #$0000A==#$0000?
04586FBEQ #$05if(z==on) goto $045876
045871JSR $FEDCSR: $04FEDCアイテム数を増やす(99個でクリップ)
045874BCS #$03if(c==on) goto $045879
045876JMP $34A7 ($0434A7)goto $0434A7
045879JMP $FED2 ($04FED2)goto $04FED2
04FED2LDA $08,SA=Stack($08)
04FED4ORA #$0001Aor=#$0001
04FED7STA $08,SStack($08)=A
04FED9JMP $34A7 ($0434A7)goto $0434A7
  • SR: $04FEDC 袋のアイテム数を増やす(99個でクリップ)
04FEDCTAXX=A
04FEDDLDA $2E7F,XA=$2E7F+X袋のアイテム情報は7E2E80-に移動
04FEE0AND #$00FFA&=#$00FF
04FEE3CMP #$0063A>=#$0063?
04FEE6BCS #$05if(c==on) goto $04FEED
04FEE8INC $2E7F,X$2E7F+X++
04FEEBCLCc=off
04FEECRTSreturn
04FEEDSECc=on
04FEEERTSreturn

個々の箇所でやることは大したことはないのですが、M,XフラグがOFFになると定数を取るニーモニックのサイズも2バイトから3バイトに変わるため、単純により多くの領域が必要になります。当然ながら周囲は隙間なく他のSRが並べられているため、サイズを増やすことはできません。さらにSR自体が引数をとっているのでPC(プログラムカウンタ)を操作していたりする都合上、安易に別SRを定義して呼ぶのは危険だったりして、やむを得ずJMPを使って別の場所に飛ばして処理を行った後同じSRに戻すというかなり汚い処理をする必要があったりもします。また、オリジナルではLDAなどで得られる結果は1バイトだけだったのが、M,XフラグがOFFになっていると2バイト取ってきてしまうため、ANDで下位1バイトだけマスクしたりする作業も必要になってきます(主に引数の値の取得など)。全部が全部2バイト化する必要がなかったりするので、個々のSRについて2バイト化の必要があるかを検討する必要があり、さらにそのSRが何をやっているのかを理解しないといけないということで結構しんどい作業だったことは確かです。袋のアイテム操作は比較的簡単でしたが各キャラクターのアイテム操作はさらに複雑でコードも領域の都合上かなりグチャグチャになっているので、ここで解説する気にはなりません。正直この作業中何度も「何やってるんだろ」と思ったりもしましたが、一応ひと通りテストも終わったのでバグがなければいいなあというのが希望的観測です。まじめに言えばテストプレイの時には一部のアイテムをID#$100以上に配置して問題なく使えるかを確認するべきなんでしょうが、他の箇所も相当変えているのでとりあえずオリジナルと差異なくプレイできるかを確認しようと思います。

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。