疑似乱数発生ルーチン『クロサワ式乱数』。
オリジナルは M680x0 のアセンブラで、以下の様な物。
『リングレイジ』に使った覚えがあるので、考えたのは 1991〜92 年だと思う。
_KurosawaRandom: ; input : A5 = Work-RAM base pointer ; output : D0 = random number move.w ((lastRnd).w,A5),D0 ; load last number eori.w #$9630,D0 ; magic #1, 9630 = クロサワ subi.w #$6553,D0 ; magic #2 rol.w #2,D0 ; magic #3 move.w D0,((lastRnd).w,A5) ; store new number rts
オペランドは source, destination
の順。
ニモニックの eor
は排他的論理和、rol
は左ローテイト。
コード中の演算と定数は、ワークステーション上のプログラムで探索した。
但し自己顕示欲として eor
する $9630
は固定で。
16bit の全パターンが現れるので、得られる数を 8bit ずつに分けて XY 座標としてプロットしてゆくと 256×256 の空間を埋められる。
後に 32bit 版はないかと問われ、同様な方法で求めようとした。
でも当時のマシンでは CPU も遅いし、RAM も少なくてスラッシングしまくりで、数ヶ月だか年単位だかの時間が掛かる事が判明したので、断念をした覚えがある。
今のマシンならもっと簡単に求まるかも。
ネットで検索した時に作者である私のページがヒットする様に、記録として残しておく。
権利を主張する以外、自由に使ってもらって構わない。
ちなみに、検索すると出てくる「東方旧作で」とか「メガドライブ方面で」というのには、私は関与していない。
念の為。