;Funktiom: Aufruf: short wuerfel(short hoechstezahl) für MaxonC++
;          Würfelt im Bereich von 1-hoechstezahl
;          4(a7) Parameter: hoechstezahl
;          d0: Rückgabe der gewürfelten Zahl
;Codename: Banger
;   Autor: Andre´ Trettin
;   Begin: 25-Sep-96 19:51:00
;    $VER: wuerfel.asm 1.0 (25-Sep-96)

	incdir  INCLUDE:
	include hardware/custom.i

	xdef    _wuerfel

_wuerfel:
	move.w  4(a7),d1            ;HöchsteZahl
	lea     .AltZufall(pc),a1   ;alte Zufallszahl bei ersten Aufruf: 0
	move.l  (a1),d0             ;d0=alte Zufallszahl
	bne.s   .keinZufallInit     ;ZufallsZahl schon Installiert
	lea     $dff000,a0          ;custombase Addresse laden
	move.w  vhposr(a0),d0       ;zufällige Werte aus Register lesen
	mulu    pot1dat(a0),d0
	add.w   vhposr(a0),d0
	swap    d0                  ;WORD wechseln
	move.w  vhposr(a0),d0       ;nochmals Register auslesen
	mulu    pot1dat(a0),d0
	add.w   vhposr(a0),d0       ;d0=ZufallsZahl init
.keinZufallInit
	add.l   #$d73b5217,d0       ;irgendein Wert addieren zur alten ZufallsZahl
	rol.l   #8,d0               ;um 8 bit rotieren
	rol.l   #8,d0               ;nochmal
	rol.l   #3,d0               ;diesmal um 3 bit rotieren
	move.l  d0,(a1)             ;als alte ZufallsZahl sichern
	clr.w   d0                  ;unteres WORD löschen
	swap    d0                  ;jetzt ist es oberes WORD
	divu    d1,d0               ;Höchste Zahl durch ZufallsWert
	swap    d0                  ;d0=Rest vom dividieren
	addq    #1,d0               ;d0+1 damit vom 1-HöchsteZahl
	rts

	even
.AltZufall:
	dc.l    0                   ;alte ZufallsZahl Speicherplatz
