		dseg
		xref	_prng_state
		xref	_modtable

		cseg
		xdef	_init_prng
		xdef	_prng
		xdef	_check_hl
		xdef	_mirror

_init_prng:	move.l	4(sp),d0
		move.l	d0,d1
		not.l	d1
		movem.l	d0-d1,_prng_state
_prng:		movem.l	d2-d3,-(sp)
		movem.l	_prng_state,d0-d1
		andi.b	#$0e,d0
		ori.b	#$20,d0
		move.l	d0,d2
		move.l	d1,d3
		add.l	d2,d2
		addx.l	d3,d3
		add.l	d2,d0
		addx.l	d3,d1
		swap	d3
		swap	d2
		move.w	d2,d3
		clr.w	d2
		add.l	d2,d0
		addx.l	d3,d1
		movem.l	d0-d1,_prng_state
		moveq	#0,d0
		swap	d1
		move.w	d1,d0
		divu	#9999,d0
		clr.w	d0
		swap	d0		
		movem.l	(sp)+,d2-d3
		rts

_check_hl:	movem.l	d2-d4,-(sp)
		swap	d0
		or.w	d1,d0
		move.l	d0,d1
		not.l	d1

		move.l	_modtable,a1
		add.l	#$8000,a1

		andi.b	#$0e,d0
		ori.b	#$20,d0
		move.l	d0,d2
		move.l	d1,d3
		add.l	d2,d2
		addx.l	d3,d3
		add.l	d2,d0
		addx.l	d3,d1
		swap	d3
		swap	d2
		move.w	d2,d3
		clr.w	d2
		add.l	d2,d0
		addx.l	d3,d1

		moveq	#3,d4
checkloop:	andi.b	#$0e,d0
		ori.b	#$20,d0
		move.l	d0,d2
		move.l	d1,d3
		add.l	d2,d2
		addx.l	d3,d3
		add.l	d2,d0
		addx.l	d3,d1
		swap	d3
		swap	d2
		move.w	d2,d3
		clr.w	d2
		add.l	d2,d0
		addx.l	d3,d1

		move.l	d1,d3
		swap	d3
		move.b	(a1,d3.w),d2

		cmp.b	(a0)+,d2
		bne.s	itiswrong

		dbf	d4,checkloop

		moveq	#1,d0
		bra.s	exitthis

itiswrong:	moveq	#0,d0
exitthis:	movem.l	(sp)+,d2-d4
		rts

_mirror:	lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		lsr.w	#1,d1
		roxl.w	#1,d0
		rts
