クロサワ式乱数

疑似乱数発生ルーチン『クロサワ式乱数』。
オリジナルは 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 も少なくてスラッシングしまくりで、数ヶ月だか年単位だかの時間が掛かる事が判明したので、断念をした覚えがある。
のマシンならもっと簡単に求まるかも。

ネットで検索した時に作者である私のページがヒットする様に、記録として残しておく。
権利を主張する以外、自由に使ってもらって構わない。 ちなみに、検索すると出てくる「東方旧作で」とか「メガドライブ方面で」というのには、私は関与していない。 念の為