home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 10: Diskmags
/
nf_archive_10.iso
/
MAGS
/
DNTPAPER
/
DNT_04.MSA
/
ARCHIVES.DNT
/
SOURCES.ZIP
/
RANDOM
/
RANDOM.S
next >
Wrap
Text File
|
1992-12-11
|
4KB
|
107 lines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; RANDOM ;
; ;
; . Appeler InitRandom pour lancer le processus, avec en paramètre: ;
; o D0<>0 Valeur initiale imposée ;
; o D0=0 ------ -------- créée de toute pièce à ;
; partir du timer système et du compteur vidéo;
; L'appel doit alors être en superviseur. ;
; ;
; . Puis, pour obtenir une nombre aléatoire 32 bits, appeler Random ;
; qui le retourne en D0. Les bits de CCR sont positionnés selon cette ;
; valeur de retour. ;
; ;
; . Selon la présence de l'étiquette __RND_TYPE, le random généré sera ;
; optimisé en taille&vitesse (0), ou normal (1) ;
; Le mode optimisé est "moins fiable" que l'autre, mais occupe moins ;
; de place et est plus rapide. A vous de choisir... ;
; (moins fiable entre guillemets, bicoze y'a aucune étude mathématique;
; faite sur cet algo (impossible); les deux représentent le même algo ;
; mais avec des paramêtres de modulo différents, le (1) étant celui ;
; donné en modèle par son inventeur) ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;NulloS/DNT-Crew 1992;
IFND __RND_TYPE
__RND_TYPE equ 0
ENDC
InitRandom movem.l d0-2/a0,-(sp) ;
tst.l d0 ;semence automatique ?
bne.s .IR_fill ;
move.w $4ba.w,d0 ;oui, on génère la semence
lsl.w #8,d0 ;
move.b $ffff8209.w,d0 ;
swap d0 ;
or.l $4ba.w,d0 ;attention à ce qu'elle ne
bne.s .IR_fill ;soit pas nulle !!
moveq #%01010011,d0 ;<-valeur quelconque!
.IR_fill moveq #54,d2 ;ce qui suit n'est pas
lea gna_buff(pc),a0 ;tout à fait un générateur
.IR_bcl move.l d0,d1 ;de Lehmer, il a été un
swap d1 ;tout petit peu modifié
mulu #46819,d0 ;pour ne pas faire dégénérer
mulu #46819,d1 ;la routine random.
swap d1 ;
eor.l d1,d0 ;
IFNE __RND_TYPE ;
move.l d0,220(a0) ;
ENDC ;
move.l d0,(a0)+ ;
dbf d2,.IR_bcl ;
movem.l (sp)+,d0-2/a0 ;
rts
IFEQ __RND_TYPE
Random movem.l d1/a0,-(sp) ;6
movea.l gna_pt(pc),a0 ;4
move.l -(a0),d0 ;4
cmpa.l #gna_buff,a0 ;4
beq.s .restart ;2/3
move.l a0,gna_pt ;5
move.l -(a0),d1 ;4
eor.l d1,d0 ;2
move.l (sp)+,d1 ;3
move.l d0,(a0) ;3
movea.l (sp)+,a0 ;3 (conserve CCR)
rts ;4 ==44
.restart lea gna_pt(pc),a0 ;2
move.l a0,(a0) ;3
move.l -(a0),d1 ;4
eor.l d1,d0 ;2
move.l (sp)+,d1 ;3
move.l d0,(a0) ;3
movea.l (sp)+,a0 ;3 (conserve CCR)
rts ;4 ==45
ELSE
Random movem.l d1/a0,-(sp) ;6
movea.l gna_pt(pc),a0 ;4
move.l -(a0),d0 ;4
move.l 23*4+4(a0),d1 ;4
eor.l d1,d0 ;2
move.l (sp)+,d1 ;3
move.l d0,(a0) ;3
cmpa.l #gna_buff,a0 ;4
beq.s .restart ;2/3
move.l a0,gna_pt ;5
move.l d0,55*4(a0) ;4 (stock & test CCR)
movea.l (sp)+,a0 ;3 (conserve CCR)
rts ;4 ==48
.restart lea gna_buff+55*4(pc),a0 ;2
move.l a0,55*4(a0) ;4
move.l d0,(a0) ;3
movea.l (sp)+,a0 ;3
rts ;4 ==49
ENDC
IFNE __RND_TYPE
gna_buff dcb.l 110,0
gna_pt dc.l gna_buff+55*4
ELSE
gna_buff dcb.l 55,0
gna_pt dc.l gna_pt
ENDC