よく参照されてる記事がありますが、詳細な処理内容、装備補正がどこで入るのか等が分からないので調査してみました。
よく参照されてる記事↓
https://bamboo.ninja-web.net/dq1,2/damage-disp/DQ12randave_jsplot2.html
アセンブリはよく分からないので、AIに聞きながら「なんとなくこうっぽい?」で進めてます。正確性は保証できません。
ダメージ乱数補正処理について
気付いたこと
256をダメージ幅で割り切れない場合は低ダメージが出やすいようです。
例えば振れ幅が9の火の息(12~20)の場合、乱数が255の時に255/9=28余り3。
そのため、12~15は29/256、16~20は28/256の確率で出ることになります。
また、割り算と切り捨てが入るので大きい値よりも小さい値の方が出やすくなります。
例
乱数2回で72を引く場合、2連続で72を引く必要がある。
乱数2回で65を引く場合、65,66の組み合わせでも切り捨てで65となる。
激しい炎のダメージ幅は8で割り切れるにも関わらず72が出る確率が65より低いのは、この仕様によるものだと思います。
処理内容
サブルーチン(ブレス・呪文ダメージ)
2026/03/20追記:敵・味方のベホイミもこのサブルーチンで計算されている
0BA5AD DA PHX
0BA5AE A9 00 LDA #$00
0BA5B0 EB XBA
0BA5B1 AD 67 00 LDA $0067
0BA5B4 29 03 AND #$03 //ここで下位2bitをマスクしてループ回数決定
0BA5B6 AA TAX
0BA5B7 BF 09 A6 0B LDA $0BA609,X
0BA5BB 85 08 STA $08
0BA5BD 64 09 STZ $09
0BA5BF 48 PHA
0BA5C0 AD 30 10 LDA $1030 //ダメージ最大値を読み込み。(はげほなら0x48)
0BA5C3 38 SEC
0BA5C4 ED 2F 10 SBC $102F //ダメージ最大値から最小値を引く。(48-41=7)
0BA5C7 A2 00 00 LDX #$0000
0BA5CA 86 0A STX $0A
//ループ開始
0BA5CC 48 PHA //サブルーチン内で計算する値をスタックへ
0BA5CD 22 7E A5 0B JSL $0BA57E //サブルーチン(振れ幅内の乱数を返す)へ
0BA5D1 18 CLC
0BA5D2 65 0A ADC $0A //合計値計算
0BA5D4 85 0A STA $0A //合計値の一時保存
0BA5D6 A9 00 LDA #$00
0BA5D8 65 0B ADC $0B
0BA5DA 85 0B STA $0B
0BA5DC 68 PLA //スタックからダメージ幅(8)を取り出す
0BA5DD E8 INX //ループ回数カウント+1
0BA5DE E4 08 CPX $08 //ループ回数確認
0BA5E0 90 EA BCC $0BA5CC //回数に達していなければ0BA5CCに戻る
//ループ終了
0BA5E2 68 PLA
0BA5E3 85 08 STA $08
0BA5E5 C2 20 REP #$20
0BA5E7 A5 0A LDA $0A //合計値をロード
0BA5E9 A6 08 LDX $08 //ループ回数をロード
0BA5EB E0 01 00 CPX #$0001
0BA5EE F0 11 BEQ $0BA601
0BA5F0 4A LSR
0BA5F1 A6 08 LDX $08
0BA5F3 E0 02 00 CPX #$0002
0BA5F6 F0 09 BEQ $0BA601
0BA5F8 4A LSR
0BA5F9 A6 08 LDX $08
0BA5FB E0 04 00 CPX #$0004
0BA5FE F0 01 BEQ $0BA601
0BA600 4A LSR //ここまで、ループ回数に応じて割り算
0BA601 E2 20 SEP #$20
0BA603 18 CLC
0BA604 6D 2F 10 ADC $102F //計算した乱数に、ダメージ最低値を足す
0BA607 FA PLX
0BA608 6B RTL
サブルーチン(振れ幅内の乱数を返す)
0BA57E DA PHX
0BA57F 1A INC //受け取った値+1(はげほなら8)
0BA580 48 PHA //スタックに8を一時保存
0BA581 22 50 A5 0B JSL $0BA550 //サブルーチン(0~255の乱数生成)
0BA585 A6 E2 LDX $E2 //生成した乱数取り出し
0BA587 8E 04 42 STX $4204 //乱数をハードウェアにセット
0BA58A 68 PLA //スタックから8を取り出し
0BA58B 8D 06 42 STA $4206 //8をハードウェアにセット
0BA58E EA NOP //ここからハードウェアの割り算処理待ち
0BA58F EA NOP
0BA590 EA NOP
0BA591 EA NOP
0BA592 EA NOP
0BA593 EA NOP
0BA594 EA NOP
0BA595 EA NOP //ここまで待ち
0BA596 AD 16 42 LDA $4216 //ハードウェアから割り算の余りを取得
0BA599 FA PLX
0BA59A 6B RTL //戻る
サブルーチン(0~255の乱数生成)
0BA550 C2 20 REP #$20
0BA552 A5 E2 LDA $E2
0BA554 48 PHA
0BA555 A5 E0 LDA $E0
0BA557 06 E0 ASL $E0
0BA559 26 E2 ROL $E2
0BA55B 18 CLC
0BA55C 65 E0 ADC $E0
0BA55E 85 E0 STA $E0
0BA560 68 PLA
0BA561 65 E2 ADC $E2
0BA563 85 E2 STA $E2
0BA565 A5 E0 LDA $E0
0BA567 18 CLC
0BA568 69 49 35 ADC #$3549
0BA56B 65 67 ADC $67
0BA56D 85 E0 STA $E0
0BA56F A5 E2 LDA $E2
0BA571 69 00 00 ADC #$0000
0BA574 85 E2 STA $E2
0BA576 E2 20 SEP #$20
0BA578 A9 00 LDA #$00
0BA57A EB XBA
0BA57B A5 E2 LDA $E2
0BA57D 6B RTL
計算順について
結論
乱数補正の後に3/4倍処理が入るっぽいです。
各ダメージの確率を知りたい場合、冒頭の記事の数値を参照し、補正して一緒になる数値は合算した確率でいいと思います。
例
激しい炎の68と69は共に、3/4倍で切り捨てて51になる。
⇒68と69の確率を合算して49.59270358%の確率で51ダメージとなる。
根拠
以下は実行時のTrace Log。Aレジスタの中身がダメージの値(16進数)になっている。
0B906B LDA $00 [$000000] = $0044 A:000E X:0000 Y:0000 S:02E3 D:0000 DB:00 P:nvmxdiZC V:251 H:326
0B906D AND #$00FF A:0044 X:0000 Y:0000 S:02E3 D:0000 DB:00 P:nvmxdizC V:251 H:334
0B9070 PHA A:0044 X:0000 Y:0000 S:02E3 D:0000 DB:00 P:nvmxdizC V:252 H:0
024B MOV A,$F4 [CPUIO0] = $00 A:00 X:50 Y:00 S:FD P:nvpbhiZc V:252 H:3
0B9071 ASL A:0044 X:0000 Y:0000 S:02E1 D:0000 DB:00 P:nvmxdizC V:252 H:7
0B9072 ADC $01,S [$0002E2] = $0044 A:0088 X:0000 Y:0000 S:02E1 D:0000 DB:00 P:nvmxdizc V:252 H:11
024D BEQ $024A A:00 X:50 Y:00 S:FD P:nvpbhiZc V:252 H:18
0B9074 STA $01,S [$0002E2] = $0044 A:00CC X:0000 Y:0000 S:02E1 D:0000 DB:00 P:nvmxdizc V:252 H:20
0B9076 PLA A:00CC X:0000 Y:0000 S:02E1 D:0000 DB:00 P:nvmxdizc V:252 H:30
0B9077 LSR A:00CC X:0000 Y:0000 S:02E3 D:0000 DB:00 P:nvmxdizc V:252 H:39
024A RET A:00 X:50 Y:00 S:FD P:nvpbhiZc V:252 H:40
0B9078 LSR A:0066 X:0000 Y:0000 S:02E3 D:0000 DB:00 P:nvmxdizc V:252 H:42
0B9079 SEP #$20 A:0033 X:0000 Y:0000 S:02E3 D:0000 DB:00 P:nvmxdizc V:252 H:46
・LDAでAレジスタにダメージ値(0x44 = 68)を読み込み
・ASLでAレジスタの値を2倍(0x88)
・ADCでAレジスタの値を加算(0xCC ここまでで3倍になる)
・LSR1/2倍を2回行って1/4倍(0x33 = 51)
実際にこの後ダメージは51だった。
この後もう一度試したら、読み込まれるダメージ値が変わっていました。
計算終了時点でAレジスタが0x30、実際のダメージが48。
このことから、既に乱数補正済みの数値を読み込んで3/4倍処理が走っていることが分かります。
処理内容(サブルーチン全体)
0B9069 C2 20 REP #$20 //16bitモードに変更
0B906B A5 00 LDA $00 //Aレジスタにダメージ値読み込み
0B906D 29 FF 00 AND #$00FF //下位8bitを使うためのマスク
0B9070 48 PHA //スタックに保存
0B9071 0A ASL //Aレジスタ2倍
0B9072 63 01 ADC $01,S //Aレジスタ+スタック⇒元の値の3倍
0B9074 83 01 STA $01,S //スタックをきれいにする処理らしい①
0B9076 68 PLA //スタックをきれいにする処理らしい②
0B9077 4A LSR //÷2
0B9078 4A LSR //÷2 →元の値の3/4倍
0B9079 E2 20 SEP #$20 //8bitモードに戻す
0B907B 85 00 STA $00 //結果をメモリに保存
0B907D 80 A9 BRA $0B9028
追記
勇者の通常攻撃ダメージの計算ルーチン
--------sub start--------
0BA05A 64 03 STZ $03
0BA05C DA PHX
0BA05D AE 60 0F LDX $0F60
0BA060 BD E2 0F LDA $0FE2,X
0BA063 FA PLX
0BA064 C9 FF CMP #$FF
0BA066 F0 01 BEQ $0BA069
0BA068 4A LSR //守備力/2
0BA069 85 01 STA $01
0BA06B A5 00 LDA $00
0BA06D 38 SEC
0BA06E E5 01 SBC $01 //攻撃力-守備力/2
0BA070 90 43 BCC $0BA0B5
0BA072 4A LSR //(攻撃力-守備力/2)/2 基礎値計算完了
0BA073 C9 02 CMP #$02
0BA075 90 3E BCC $0BA0B5 //2回ならジャンプ
0BA077 85 03 STA $03
0BA079 C9 09 CMP #$09
0BA07B 90 3F BCC $0BA0BC //9以下ならジャンプ
0BA07D 8D 02 42 STA $4202
0BA080 A9 07 LDA #$07
0BA082 8D 03 42 STA $4203 //基礎値*7
0BA085 EA NOP
0BA086 EA NOP
0BA087 EA NOP
0BA088 C2 20 REP #$20
0BA08A AD 16 42 LDA $4216
0BA08D 4A LSR
0BA08E 4A LSR
0BA08F 4A LSR //基礎値*7/8 最低ダメージ計算完了
0BA090 85 06 STA $06 //最低ダメージメモ
0BA092 E2 20 SEP #$20
0BA094 A5 03 LDA $03 //基礎値読み込み
0BA096 4A LSR
0BA097 4A LSR //基礎値/4
0BA098 1A INC //+1
0BA099 48 PHA
0BA09A 22 50 A5 0B JSL $0BA550 //乱数生成サブルーチンへ
0BA09E 8D 02 42 STA $4202 //乱数0-255をセット
0BA0A1 68 PLA
0BA0A2 8D 03 42 STA $4203 //ダメージ振れ幅をセット
0BA0A5 EA NOP
0BA0A6 EA NOP
0BA0A7 EA NOP
0BA0A8 EA NOP
0BA0A9 AC 16 42 LDY $4216 //セットした値の積を取得
0BA0AC 84 08 STY $08 //乗算結果を格納
0BA0AE A5 09 LDA $09 //乗算結果の上位バイトをAレジスタに読み込み(÷256)
0BA0B0 18 CLC
0BA0B1 65 06 ADC $06 //Aレジスタに最低ダメージを加算(最終ダメージ)
0BA0B3 80 12 BRA $0BA0C7
0BA0B5 AD 67 00 LDA $0067
0BA0B8 29 01 AND #$01
0BA0BA 80 0B BRA $0BA0C7
0BA0BC A9 02 LDA #$02
0BA0BE 22 7E A5 0B JSL $0BA57E
0BA0C2 18 CLC
0BA0C3 65 03 ADC $03
0BA0C5 3A DEC
0BA0C6 3A DEC
0BA0C7 C9 00 CMP #$00
0BA0C9 D0 07 BNE $0BA0D2
0BA0CB 9C 91 0C STZ $0C91
0BA0CE 9C 92 0C STZ $0C92
0BA0D1 60 RTS
----------------
敵の通常攻撃のダメージを計算するルーチン
ロジックは同じっぽい
--------sub start--------
0B8AF4 A6 AE LDX $AE
0B8AF6 B9 DB 0F LDA $0FDB,Y
0B8AF9 85 00 STA $00
0B8AFB 64 03 STZ $03
0B8AFD BD 3D 0C LDA $0C3D,X
0B8B00 4A LSR //守備力/2
0B8B01 85 01 STA $01
0B8B03 A5 00 LDA $00
0B8B05 38 SEC
0B8B06 E5 01 SBC $01 //攻撃力-守備力/2
0B8B08 90 44 BCC $0B8B4E
0B8B0A 4A LSR //(攻撃力-守備力/2)/2 基礎値計算完了
0B8B0B 85 03 STA $03 //基礎値をメモ
0B8B0D C9 02 CMP #$02
0B8B0F 90 3D BCC $0B8B4E //2以下の場合ジャンプ
0B8B11 C9 09 CMP #$09
0B8B13 90 41 BCC $0B8B56 //9以下の場合ジャンプ
0B8B15 8D 02 42 STA $4202
0B8B18 A9 07 LDA #$07
0B8B1A 8D 03 42 STA $4203 //基礎値*7をハードウェアで計算
0B8B1D EA NOP
0B8B1E EA NOP
0B8B1F EA NOP
0B8B20 C2 20 REP #$20
0B8B22 AD 16 42 LDA $4216
0B8B25 4A LSR
0B8B26 4A LSR
0B8B27 4A LSR //基礎値*7/8 最低ダメージ計算完了
0B8B28 85 06 STA $06 //最低ダメージをメモ
0B8B2A E2 20 SEP #$20
0B8B2C A5 03 LDA $03 //基礎値読み込み
0B8B2E 4A LSR
0B8B2F 4A LSR //基礎値/4
0B8B30 1A INC //+1
0B8B31 48 PHA
0B8B32 22 50 A5 0B JSL $0BA550 //乱数生成
0B8B36 8D 02 42 STA $4202
0B8B39 68 PLA
0B8B3A 8D 03 42 STA $4203
0B8B3D EA NOP
0B8B3E EA NOP
0B8B3F EA NOP
0B8B40 EA NOP
0B8B41 AC 16 42 LDY $4216
0B8B44 84 08 STY $08
0B8B46 A5 09 LDA $09 //乗算結果の上位バイトを取得
0B8B48 18 CLC
0B8B49 65 06 ADC $06 //最低ダメージを加算(最終ダメージ)
0B8B4B 4C 63 8B JMP $8B63
0B8B4E 22 50 A5 0B JSL $0BA550
0B8B52 29 01 AND #$01
0B8B54 80 0D BRA $0B8B63
0B8B56 A5 03 LDA $03
0B8B58 A9 02 LDA #$02
0B8B5A 22 7E A5 0B JSL $0BA57E
0B8B5E 18 CLC
0B8B5F 65 03 ADC $03
0B8B61 3A DEC
0B8B62 3A DEC
0B8B63 C9 00 CMP #$00
0B8B65 D0 08 BNE $0B8B6F
0B8B67 9C 91 0C STZ $0C91
0B8B6A 9C 92 0C STZ $0C92
0B8B6D 38 SEC
0B8B6E 60 RTS
----------------
ホイミ回復量計算
25-28の確率がそれぞれ43/256、29,30の確率がそれぞれ42/256になると思われる
--------sub start--------
0BA59B DA PHX
0BA59C AD 30 10 LDA $1030 //30
0BA59F 38 SEC
0BA5A0 ED 2F 10 SBC $102F //30-25
0BA5A3 22 7E A5 0B JSL $0BA57E //振れ幅内の乱数を返すサブルーチン
0BA5A7 18 CLC
0BA5A8 6D 2F 10 ADC $102F //計算結果+最低値25
0BA5AB FA PLX
0BA5AC 6B RTL
----------------
薬草の計算処理
振れ幅16なので、一様分布
--------sub start--------
0BAE25 64 1B STZ $1B
0BAE27 A9 0F LDA #$0F //15(振れ幅取得)
0BAE29 22 7E A5 0B JSL $0BA57E //0-15の乱数取得
0BAE2D 18 CLC
0BAE2E 69 14 ADC #$14 //振れ幅+20(回復量の計算完了)
0BAE30 A6 1A LDX $1A
0BAE32 18 CLC
0BAE33 7D 09 0C ADC $0C09,X
0BAE36 90 02 BCC $0BAE3A
0BAE38 A9 FF LDA #$FF
0BAE3A DD 2D 0C CMP $0C2D,X
0BAE3D 90 03 BCC $0BAE42
0BAE3F BD 2D 0C LDA $0C2D,X
0BAE42 9D 09 0C STA $0C09,X
0BAE45 A5 70 LDA $70
0BAE47 30 07 BMI $0BAE50
0BAE49 A9 12 LDA #$12
0BAE4B 22 63 83 09 JSL $098363
0BAE4F 6B RTL
----------------
通常と会心の分岐部分
--------sub start--------
0B9FA6 BD 35 0C LDA $0C35,X
0B9FA9 85 00 STA $00
0B9FAB 22 50 A5 0B JSL $0BA550
0B9FAF C9 08 CMP #$08
0B9FB1 B0 15 BCS $0B9FC8 //Aレジスタの値が8以上の場合、通常ダメージへ
0B9FB3 20 D9 A0 JSR $A0D9 //会心ダメージへ
0B9FB6 BD BB 0F LDA $0FBB,X
0B9FB9 D0 03 BNE $0B9FBE
0B9FBB FE BB 0F INC $0FBB,X
0B9FBE AD 91 0C LDA $0C91
0B9FC1 8D 49 10 STA $1049
0B9FC4 A0 02 00 LDY #$0002
0B9FC7 6B RTL
----------------
会心ダメージ計算
下位3乱数が24/256、上位8乱数が23/256の確率で出る
--------sub start--------
0BA0D9 A9 0A LDA #$0A
0BA0DB 22 7E A5 0B JSL $0BA57E //0~10の乱数を返す
0BA0DF 1A INC //乱数+1
0BA0E0 18 CLC
0BA0E1 69 36 ADC #$36 //乱数+1+54 → 55~65になる
0BA0E3 8D 02 42 STA $4202
0BA0E6 A5 00 LDA $00
0BA0E8 8D 03 42 STA $4203
0BA0EB EA NOP
0BA0EC EA NOP
0BA0ED EA NOP
0BA0EE C2 20 REP #$20
0BA0F0 AD 16 42 LDA $4216 //55~65×攻撃力
0BA0F3 4A LSR
0BA0F4 4A LSR
0BA0F5 4A LSR
0BA0F6 4A LSR
0BA0F7 4A LSR
0BA0F8 4A LSR //÷64
0BA0F9 C9 FE 00 CMP #$00FE
0BA0FC 90 03 BCC $0BA101
0BA0FE A9 FE 00 LDA #$00FE
0BA101 E2 20 SEP #$20
0BA103 C9 00 CMP #$00
0BA105 F0 C0 BEQ $0BA0C7
0BA107 8D 91 0C STA $0C91
0BA10A 9C 92 0C STZ $0C92
0BA10D 60 RTS
----------------
行動順計算
--------sub start--------
0B9E1E A2 00 00 LDX #$0000
0B9E21 9B TXY
0B9E22 AD A0 0F LDA $0FA0
0B9E25 F0 03 BEQ $0B9E2A
0B9E27 4C 62 9E JMP $9E62
0B9E2A A9 7F LDA #$7F
0B9E2C 22 7E A5 0B JSL $0BA57E //サブルーチンへ 0-127の乱数を返す
0B9E30 8D 02 42 STA $4202
0B9E33 B9 D4 0F LDA $0FD4,Y //敵の素早さ
0B9E36 8D 03 42 STA $4203
0B9E39 EA NOP
0B9E3A EA NOP
0B9E3B EA NOP
0B9E3C DA PHX
0B9E3D AE 16 42 LDX $4216 //Xレジスタに乱数と振れ幅の乗算結果取得
0B9E40 86 0D STX $0D
0B9E42 FA PLX
0B9E43 B9 D4 0F LDA $0FD4,Y
0B9E46 38 SEC
0B9E47 E5 0E SBC $0E //最大値-振れ幅の減少分
0B9E49 9D 80 0B STA $0B80,X
0B9E4C E8 INX
0B9E4D A9 00 LDA #$00
0B9E4F 9D 80 0B STA $0B80,X
0B9E52 99 4B 0F STA $0F4B,Y
0B9E55 E8 INX
0B9E56 C8 INY
0B9E57 98 TYA
0B9E58 CD DC 0E CMP $0EDC
0B9E5B 90 CD BCC $0B9E2A
0B9E5D AD E6 0C LDA $0CE6
0B9E60 F0 33 BEQ $0B9E95
0B9E62 A0 00 00 LDY #$0000
0B9E65 A9 57 LDA #$57
0B9E67 22 7E A5 0B JSL $0BA57E //サブルーチンへ 0-87の乱数を返す
0B9E6B 8D 02 42 STA $4202
0B9E6E B9 21 0C LDA $0C21,Y //勇者の素早さ
0B9E71 8D 03 42 STA $4203
0B9E74 EA NOP
0B9E75 EA NOP
0B9E76 EA NOP
0B9E77 DA PHX
0B9E78 AE 16 42 LDX $4216
0B9E7B 86 06 STX $06
0B9E7D FA PLX
0B9E7E B9 21 0C LDA $0C21,Y
0B9E81 38 SEC
0B9E82 E5 07 SBC $07
0B9E84 9D 80 0B STA $0B80,X
0B9E87 E8 INX
0B9E88 A9 01 LDA #$01
0B9E8A 9D 80 0B STA $0B80,X
0B9E8D E8 INX
0B9E8E C8 INY
0B9E8F 98 TYA
0B9E90 CD E6 0C CMP $0CE6
0B9E93 90 D0 BCC $0B9E65
0B9E95 AD DC 0E LDA $0EDC
0B9E98 48 PHA
0B9E99 AD A0 0F LDA $0FA0
0B9E9C F0 03 BEQ $0B9EA1
0B9E9E 9C DC 0E STZ $0EDC
0B9EA1 8A TXA
0B9EA2 4A LSR
0B9EA3 20 AB 9E JSR $9EAB
0B9EA6 68 PLA
0B9EA7 8D DC 0E STA $0EDC
0B9EAA 6B RTL
----------------
勇者睡眠時の行動処理
--------sub start--------
0BA97A E2 10 SEP #$10
0BA97C 64 00 STZ $00
0BA97E A0 00 LDY #$00
0BA980 B9 BE 0E LDA $0EBE,Y //ラリホーフラグ読み込み 最初は4
0BA983 F0 0E BEQ $0BA993 //0ならジャンプ
0BA985 A9 02 LDA #$02
0BA987 99 BB 0F STA $0FBB,Y //勇者の行動に02(防御)をセット
0BA98A C8 INY
0BA98B CC E6 0C CPY $0CE6
0BA98E 90 F0 BCC $0BA980 //多分、人数分ループ処理
0BA990 38 SEC
0BA991 80 01 BRA $0BA994
0BA993 18 CLC
0BA994 C2 10 REP #$10
0BA996 6B RTL
----------------
勇者起床判定
--------sub start--------
00D514 F0 E3 BEQ $00D4F9
00D516 B9 BE 0E LDA $0EBE,Y
00D519 F0 1F BEQ $00D53A //眠りフラグ0ならジャンプ
00D51B C9 01 CMP #$01
00D51D F0 04 BEQ $00D523 //1ならジャンプ
00D51F 3A DEC //フラグを更新(4→3→2→1と減らす)
00D520 99 BE 0E STA $0EBE,Y
00D523 AA TAX
00D524 22 50 A5 0B JSL $0BA550 //乱数取得
00D528 DD 75 D2 CMP $D275,X //乱数と以下の数値を比較
//D276(3T目以降) : C0、D277(2T目) : 80、D278(1T目) : 40
00D52B 90 04 BCC $00D531//乱数が規定値未満なら、起床処理へ
00D52D A0 08 00 LDY #$0008 //表示用眠っているフラグ?
00D530 60 RTS
----------------
勇者起床処理
--------sub start--------
00D531 A9 00 LDA #$00
00D533 99 BE 0E STA $0EBE,Y
00D536 A0 0A 00 LDY #$000A //表示用起きたフラグ?
00D539 60 RTS
----------------
以下、DQ2での検証
敵出現時のHP決定処理
--------sub start--------
0B9D7C C9 0A CMP #$0A
0B9D7E 90 30 BCC $0B9DB0//最大HP10未満の分岐
0B9D80 DA PHX
0B9D81 5A PHY
0B9D82 48 PHA
0B9D83 A9 14 LDA #$14 //Aレジスタに20を入れる
0B9D85 22 7E A5 0B JSL $0BA57E //振れ幅内(0~20)の乱数を返す
0B9D89 18 CLC
0B9D8A 69 50 ADC #$50 //0~20の乱数+80
0B9D8C 8D 02 42 STA $4202 //80~100の値をセット
0B9D8F 68 PLA
0B9D90 8D 03 42 STA $4203 //元のHPをセット
0B9D93 EA NOP
0B9D94 EA NOP
0B9D95 EA NOP
0B9D96 EA NOP
0B9D97 AE 16 42 LDX $4216 //80~100の値×元のHP
0B9D9A 8E 04 42 STX $4204
0B9D9D A9 64 LDA #$64
0B9D9F 8D 06 42 STA $4206
0B9DA2 EA NOP
0B9DA3 EA NOP
0B9DA4 EA NOP
0B9DA5 EA NOP
0B9DA6 EA NOP
0B9DA7 EA NOP
0B9DA8 EA NOP
0B9DA9 EA NOP
0B9DAA AD 14 42 LDA $4214 //÷100
0B9DAD 7A PLY
0B9DAE FA PLX
0B9DAF 60 RTS
----------------