快傑ヤンチャ丸3 乱数調査 ------------------------ $930C がアイテム生成処理 $C000 が乱数値更新処理 $06F6 (敵撃破カウンタ)が5になるとアイテム生成が行われる。このとき乱数値 $068A が読み取られ、その値が ・#$99 未満ならば小判(A = #$3B) ・#$99 以上、#$CC 未満ならば巻物(A = #$38) ・#$CC 以上ならば爆弾(A = #$32) が出現する(ちなみに、このときデバッガで A を適当に書き換えると別のキャラクタ が出現する。例えば A = #$3A で扉が出現) ルーチン $C000 を擬似コード化すると: ++mem[0x0047] /* これはルーチン外で事前に行われているものと思われる */ A = mem[0x068A] & 0x07; Y = A; do{ rol(0x0689); rol(0x068A); --Y; } while(!(Y & 0x80)); /* ここまででキャリーフラグは操作されないから ADC でなければならない */ adc(0x0689, mem[0x0047] & 0x04); adc(&A, mem[0x068A]); mem[0x068A] = A; $0689 の初期値は #$55, $068A の初期値は 0。 ルーチン $C000 はキャリーフラグに依存する。大抵はキャリーフラグがクリアされ た状態で呼び出されるのだが、敵が出現するフレームではキャリーフラグがセットさ れて呼び出されるようだ。従って、長期にわたって乱数値を予測するのは難しそう。