; d0 - top/seed

	xdef	_Rnd

_Rnd	move.l	d0,d2
	blt.s	.set
	move.w	d2,d1
	subq.w	#1,d1
	move.l	(.rnd,pc),d0
.2	add.l	d0,d0
	bhi.s	.3
	eori.l	#$1d872b41,d0
.3	lsr.w	#$1,d1
	bne.s	.2
	lea	(.rnd,pc),a0
	move.l	d0,(a0)
	tst.w	d2
	bne.s	.4
	swap	d0
	bra.s	.5
.4	mulu	d2,d0
.5	clr.w	d0
	swap	d0
	rts
.set	neg.l	d2
	lea	(.rnd,pc),a0
	move.l	d2,(a0)
	rts

.rnd	dc.l	0
