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 >
Text File  |  1992-12-11  |  4KB  |  107 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;                                 RANDOM                                  ;
  3. ;                                                                         ;
  4. ;   . Appeler InitRandom pour lancer le processus, avec en paramètre:     ;
  5. ;                    o D0<>0  Valeur initiale imposée                     ;
  6. ;                    o D0=0   ------ -------- créée de toute pièce à      ;
  7. ;                             partir du timer système et du compteur vidéo;
  8. ;                             L'appel doit alors être en superviseur.     ;
  9. ;                                                                         ;
  10. ;   . Puis, pour obtenir une nombre aléatoire 32 bits, appeler Random     ;
  11. ;     qui le retourne en D0. Les bits de CCR sont positionnés selon cette ;
  12. ;     valeur de retour.                                                   ;
  13. ;                                                                         ;
  14. ;   . Selon la présence de l'étiquette __RND_TYPE, le random généré sera  ;
  15. ;     optimisé en taille&vitesse (0), ou normal (1)                       ;
  16. ;     Le mode optimisé est "moins fiable" que l'autre, mais occupe moins  ;
  17. ;     de place et est plus rapide. A vous de choisir...                   ;
  18. ;     (moins fiable entre guillemets, bicoze y'a aucune étude mathématique;
  19. ;     faite sur cet algo (impossible); les deux représentent le même algo ;
  20. ;     mais avec des paramêtres de modulo différents, le (1) étant celui   ;
  21. ;     donné en modèle par son inventeur)                                  ;
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;NulloS/DNT-Crew 1992;
  23.  
  24.     IFND    __RND_TYPE
  25. __RND_TYPE    equ    0
  26.     ENDC
  27.  
  28. InitRandom    movem.l    d0-2/a0,-(sp)    ;
  29.     tst.l    d0        ;semence automatique ?
  30.     bne.s    .IR_fill        ;
  31.     move.w    $4ba.w,d0        ;oui, on génère la semence
  32.     lsl.w    #8,d0        ;
  33.     move.b    $ffff8209.w,d0    ;
  34.     swap    d0        ;
  35.     or.l    $4ba.w,d0        ;attention à ce qu'elle ne
  36.     bne.s    .IR_fill        ;soit pas nulle !!
  37.     moveq    #%01010011,d0    ;<-valeur quelconque!
  38. .IR_fill    moveq    #54,d2        ;ce qui suit n'est pas
  39.     lea    gna_buff(pc),a0    ;tout à fait un générateur
  40. .IR_bcl    move.l    d0,d1        ;de Lehmer, il a été un
  41.     swap    d1        ;tout petit peu modifié
  42.     mulu    #46819,d0        ;pour ne pas faire dégénérer
  43.     mulu    #46819,d1        ;la routine random.
  44.     swap    d1        ;
  45.     eor.l    d1,d0        ;
  46.     IFNE    __RND_TYPE        ;
  47.     move.l    d0,220(a0)        ;
  48.     ENDC            ;
  49.     move.l    d0,(a0)+        ;
  50.     dbf    d2,.IR_bcl        ;
  51.     movem.l    (sp)+,d0-2/a0    ;
  52.     rts
  53.  
  54.     IFEQ    __RND_TYPE
  55. Random    movem.l    d1/a0,-(sp)    ;6
  56.     movea.l    gna_pt(pc),a0    ;4
  57.     move.l    -(a0),d0        ;4
  58.     cmpa.l    #gna_buff,a0    ;4
  59.     beq.s    .restart        ;2/3
  60.     move.l    a0,gna_pt        ;5
  61.     move.l    -(a0),d1        ;4
  62.     eor.l    d1,d0        ;2
  63.     move.l    (sp)+,d1        ;3
  64.     move.l    d0,(a0)        ;3
  65.     movea.l    (sp)+,a0        ;3 (conserve CCR)
  66.     rts            ;4 ==44
  67.  
  68. .restart    lea    gna_pt(pc),a0    ;2
  69.     move.l    a0,(a0)        ;3
  70.     move.l    -(a0),d1        ;4
  71.     eor.l    d1,d0        ;2
  72.     move.l    (sp)+,d1        ;3
  73.     move.l    d0,(a0)        ;3
  74.     movea.l    (sp)+,a0        ;3 (conserve CCR)
  75.     rts            ;4 ==45
  76.  
  77.     ELSE
  78.  
  79. Random    movem.l    d1/a0,-(sp)    ;6
  80.     movea.l    gna_pt(pc),a0    ;4
  81.     move.l    -(a0),d0        ;4
  82.     move.l    23*4+4(a0),d1    ;4
  83.     eor.l    d1,d0        ;2
  84.     move.l    (sp)+,d1        ;3
  85.     move.l    d0,(a0)        ;3
  86.     cmpa.l    #gna_buff,a0    ;4
  87.     beq.s    .restart        ;2/3
  88.     move.l    a0,gna_pt        ;5
  89.     move.l    d0,55*4(a0)    ;4 (stock & test CCR)
  90.     movea.l    (sp)+,a0        ;3 (conserve CCR)
  91.     rts            ;4 ==48
  92.  
  93. .restart    lea    gna_buff+55*4(pc),a0    ;2
  94.     move.l    a0,55*4(a0)    ;4
  95.     move.l    d0,(a0)        ;3
  96.     movea.l    (sp)+,a0        ;3
  97.     rts            ;4 ==49
  98.     ENDC
  99.  
  100.     IFNE    __RND_TYPE
  101. gna_buff    dcb.l    110,0
  102. gna_pt    dc.l    gna_buff+55*4
  103.     ELSE
  104. gna_buff    dcb.l    55,0
  105. gna_pt    dc.l    gna_pt
  106.     ENDC
  107.