ようやく余裕が出てきたので更新します。体調不良と言っても別に深刻なものではなくただの風邪です。時期が時期だけにあまり寝込むわけにも行かず、ここの更新まで手が回らないということもあり、しばし更新停止のお知らせを出しただけです。お騒がせしてすいません。
前回までで大体の枠については実装が終わったので、配分計算の部分を実装します。
- SR: $02ECF4 一人当たりの経験値計算(平等)(新SR)
| 02ECF4 | JSR $A7A1 | SR: $02A7A1 | 生存人数取得 |
|---|---|---|---|
| 02ECF7 | PHA | Push A | |
| 02ECF8 | LDA $23DC | A=$7E23DC | |
| 02ECFB | STA $00 | $000000=A | |
| 02ECFD | LDA $23DE | A=$7E23DE | |
| 02ED00 | STA $02 | $000002=A | |
| 02ED02 | LDX #$0000 | X=#$0000 | |
| 02ED05 | PLA | Pull A | |
| 02ED06 | JSL $001243 | SR: $001243 | $00,X(3B)=$00,X(3B)/A(1B) 剰余=A |
| 02ED0A | JSL $02B9A6 | SR: $02B9A6 | パーティ人数取得 |
| 02ED0E | STA $04 | $000004=A | |
| 02ED10 | LDY #$0000 | Y=#$0000 | |
| 02ED13 | CPY $04 | Y==$000004? | |
| 02ED15 | BEQ #$1A | if(z==on) goto $02ED31 | |
| 02ED17 | TYA | A=Y | |
| 02ED18 | ASL | A<<1 | |
| 02ED19 | TAX | X=A | |
| 02ED1A | LDA $2650,X | A=$7E2650+X | 差分レベルが0なら配分対象外 |
| 02ED1D | BEQ #$0F | if(z==on) goto $02ED2E | |
| 02ED1F | LDA $02EADF,X | A=$02EADF+X | |
| 02ED23 | TAX | X=A | |
| 02ED24 | LDA $00 | A=$000000 | |
| 02ED26 | STA $2640,X | $7E2640+X=A | 経験値下位2バイトセット |
| 02ED29 | LDA $02 | A=$000002 | |
| 02ED2B | STA $2642,X | $7E2642+X=A | 経験値上位2バイトセット |
| 02ED2E | INY | Y++ | |
| 02ED2F | BRA #$E2 | goto $02ED13 | |
| 02ED31 | RTS | return |
- SR: $02ED8F 一人当たりの経験値計算(傾斜)(新SR)
| 02ED8F | LDX #$0000 | X=#$0000 | |
|---|---|---|---|
| 02ED92 | LDA $2650,X | A=$7E2650+X | |
| 02ED95 | CLC | c=off | |
| 02ED96 | ADC $265A | A+=$7E265A | |
| 02ED99 | STA $265A | $7E265A=A | |
| 02ED9C | INX | X++ | |
| 02ED9D | INX | X++ | |
| 02ED9E | CPX #$0008 | X>=#$0008 ? | |
| 02EDA1 | BCC #$EF | if(c==off) goto $02ED92 | |
| 02EDA3 | LDY #$0000 | Y=#$0000 | |
| 02EDA6 | LDA $2650,Y | A=$7E2650+Y | |
| 02EDA9 | BEQ #$32 | if(z==on) goto $02EDDD | |
| 02EDAB | LDA $23DC | A=$7E23DC | |
| 02EDAE | STA $00 | $000000=A | |
| 02EDB0 | LDA $23DE | A=$7E23DE | |
| 02EDB3 | STA $02 | $000002=A | |
| 02EDB5 | LDX #$0000 | X=#$0000 | |
| 02EDB8 | LDA $2650,Y | A=$7E2650+Y | 分子をセット |
| 02EDBB | JSL $001107 | SR: $001107 | $00,X(4B)=A(1)*$00,X(3B) |
| 02EDBF | LDA $265A | A=$7E265A | 分母で割る |
| 02EDC2 | JSL $00F315 | SR: $00F315 | $00,x(4B)=$00,X(4B)/A(2B?) 剰余=A |
| 02EDC6 | CLC | c=off | |
| 02EDC7 | ADC $265C | A+=$7E265C | |
| 02EDCA | STA $265C | $7E265C=A | |
| 02EDCD | TYX | X=Y | |
| 02EDCE | LDA $02EADF,X | A=$02EADF+X | |
| 02EDD2 | TAX | X=A | |
| 02EDD3 | LDA $00 | A=$000000 | |
| 02EDD5 | STA $2640,X | $7E2640+X=A | |
| 02EDD8 | LDA $02 | A=$000002 | |
| 02EDDA | STA $2642,X | $7E2642+X=A | |
| 02EDDD | JSR $EDEE | SR: $02EDEE | 経験値が3ByteMaxを超えていたら3バイトでクリップする(Yはオフセット) |
| 02EDE0 | INY | Y++ | |
| 02EDE1 | INY | Y++ | |
| 02EDE2 | CPY #$0008 | Y>=#$0008 ? | |
| 02EDE5 | BCC #$C2 | if(c==off) goto $02EDA9 | |
| 02EDE7 | LDA #$0001 | A=#$0001 | 傾斜配分フラグをON |
| 02EDEA | STA $265E | $7E265E=A | |
| 02EDED | RTS | return |
ズラズラと長い処理になっていますが、やっていることは単なる数値計算です。また、各自の経験値アドレスに簡単にアクセスするために、先頭アドレス($7E2640)からのオフセットを定数で定義しました($02EADF-07, 2バイト*4)。
- SR: $00F315 $00,x(4B)=$00,X(4B)/A(2B?) 剰余=A(新SR)
| 00F315 | PHP | Push P Flag | |
|---|---|---|---|
| 00F316 | REP #$30 | m=off(A/M:16b), x=off(X/Y:16b) | |
| 00F318 | PHA | Push A | |
| 00F319 | PHX | Push X | |
| 00F31A | PHY | Push Y | |
| 00F31B | PHB | Push DB | |
| 00F31C | SEI | i=on | |
| 00F31D | STA $36 | $000036=A | |
| 00F31F | LDA $00,X | A=$000000+X | |
| 00F321 | STA $32 | $000032=A | |
| 00F323 | LDA $02,X | A=$000002+X | |
| 00F325 | STA $34 | $000034=A | |
| 00F327 | LDY #$0020 | Y=#$0020 | 32ビットシフトする |
| 00F32A | LDA #$0000 | A=#$0000 | |
| 00F32D | ASL $32 | $000032<<1 | |
| 00F32F | ROL $34 | ($000034+C)<<1 | |
| 00F331 | ROL | (A+C)<<1 | |
| 00F332 | CMP $36 | A>=$000036? | |
| 00F334 | BCC #$02 | if(c==off) goto $00F338 | |
| 00F336 | SBC $36 | A-=$000036 | |
| 00F338 | ROL $00,X | $000000+X<<1 | |
| 00F33A | ROL $02,X | $000002+X<<1 | |
| 00F33C | DEY | Y– | |
| 00F33D | BNE #$EE | if(z==off) goto $00F32D | |
| 00F33F | STA $30 | $000030=A | |
| 00F341 | PLB | Pull DB | |
| 00F342 | REP #$30 | m=off(A/M:16b), x=off(X/Y:16b) | |
| 00F344 | PLY | Pull Y | |
| 00F345 | PLX | Pull X | |
| 00F346 | PLA | Pull A | |
| 00F347 | PLP | Pull P Flag | |
| 00F348 | LDA $30 | A=$000030 | |
| 00F34A | RTL | return |
元ネタになっているSR: $001295よりは処理は単純です。一応何パターンか手元の電卓ソフトと結果を付きあわせてみたのですが、正しい値になっているようなのでOKっぽいです。
- SR: $02A767 経験値獲得メッセージ表示
| 略 | |||
|---|---|---|---|
| 02A778 | JSR $EE49 | SR: $02EE49 | 経験値獲得時の「それぞれ」を「へいきん」に変える |
| 略 |
- SR: $02EE49 経験値獲得時の「それぞれ」を「へいきん」に変える(新SR)
| 02EE49 | LDA #$0028 | A=#$0028 | 戦闘メッセージID「それぞれ」 |
|---|---|---|---|
| 02EE4C | PHA | Push A | |
| 02EE4D | LDA $265E | A=$7E265E | |
| 02EE50 | AND #$0001 | A&=#$0001 | 傾斜配分フラグがON |
| 02EE53 | BEQ #$05 | if(z==on) goto $02EE5A | |
| 02EE55 | LDA #$01AD | A=#$01AD | 戦闘メッセージID「へいきん」 |
| 02EE58 | STA $01,S | Stack($01)=A | |
| 02EE5A | PLA | Pull A | |
| 02EE5B | RTS | return |
とりあえず実体に関する部分はこれで終わりです。当初はこれで終りにしようと思ったのですが、いろいろ考えた結果、各自の獲得した経験値を表示するウィンドウを新規に定義して表示することにしました。その実装についてはまた次回。


コメント