Advertisement
SMicro

Generador de números Pseudoaleatorios

May 13th, 2015
1,774
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *-----------------------------------------------------------
  2. * Program    :
  3. * Written by :  Fulgencio
  4. * Date       :
  5. * Description:  Este programa genera números pseudoaleatorios mediante el algoritmo
  6. *       de Galois. Se toma como semilla el número de centésimas de segundo
  7. *       desde medianoche, que se obtiene con la TASK 8
  8. *               Consiste en dos subrutinas, una de ellas SE LLAMA SOLO UNA VEZ (INIRND)
  9. *               y genera la semilla inicial a partir de las centésimas de segundo del reloj
  10. *               La otra subrutina (LAB_RND) obtiene un valor pseudoaleatorio escalado entre
  11. *               0 y RANGO (valor máximo) que se asigna a D0 antes de llamarle
  12. *-----------------------------------------------------------
  13.     ORG $1000
  14. RANGO   EQU 10
  15. ***************** Este bloque es solo para probar el generador de números aleatorios
  16. ***************** Hacemos llamadas a la subrutina con RANGO=10 y presentamos el resultado
  17. ***************** obtenido
  18. START  
  19.         JSR INIRND    ;Inicializa la semilla (SOLO SE LLAMA UNA VEZ POR EJECUCIÓN DE PROGRAMA)
  20.        
  21. OTRO    MOVE.L #RANGO,D0
  22.         JSR LAB_RND   ;Obtiene un valor entre 0-RANGO
  23.         MOVE.L D0,D1
  24.         MOVE.L #3,D0  ;Presenta número obtenido
  25.         TRAP #15
  26.  
  27.         MOVE.L #5,D0  ;Espera pulsa tecla
  28.         TRAP #15
  29.         JMP OTRO
  30.        
  31. ***************************************
  32. INIRND                *Esta subrutina inicializa la semilla (variable PRNL) a partir del reloj
  33.         MOVE.L  #8,D0
  34.     TRAP    #15
  35.     MOVE.L D1,PRNL *En D1 obtenemos las centesimas de segundo desde media noche que asignamos a PRNL
  36.         RTS
  37. ***************************************
  38.    
  39. ******** ALGORITMO  (Necesita haber inicializado previamente la semilla, PRNL, con un long)
  40. ********             Devuelve en D0 un valor pseudoaleatorio de 16 bits)
  41. LAB_RND MOVEM.L D1-D3,-(A7) ;guarda registros utilizados
  42.  
  43.         MOVE.L D0,D1
  44.         ADD.L #1,D1       * calculamos el rango para un valor más (luego lo eliminamos)
  45.         MOVE.L #$FFFF,D0
  46.         DIVU D1,D0        * obtiene el factor de escala rango
  47.         AND.L #$FFFF,D0   * elimina resto
  48.         ADD.L #1,D0       * sumamos 1 al factor de escala para eliminar el posible valor de más
  49.         MOVE.L D0,D3      * pasamos factor de escala a D3
  50.        
  51.     MOVE.L  PRNL,D0     * get current seed longword
  52.     MOVEQ       #$AF-$100,d1        * set EOR value
  53.     MOVEQ       #19,d2          * do this 19 times
  54. Ninc0
  55.     ADD.L       d0,d0               * shift left 1 bit
  56.     BCC.S       Ninc1               * if bit not set skip feedback
  57.  
  58.     EOR.B       D1,D0               * do Galois LFSR feedback
  59. Ninc1
  60.     SUBQ #1,D2
  61.     BNE         Ninc0           * loop
  62.  
  63.     MOVE.L  D0,PRNL     * save back to seed longword
  64.    
  65.     SWAP D0      ;Obtiene la palabra alta
  66.     AND.L #$FFFF,D0  ;Se queda con esa palabra 0-65535
  67.        
  68.         DIVU D3,D0       ;aplicamos factor de escala    
  69.     AND.L #$FFFF,D0  ;Se queda solo con el cociente (solo 16 bits)
  70.     MOVEM.L (A7)+,D1-D3
  71.         RTS
  72.        
  73.        
  74. PRNL    DS.L 1          *Esta variable global sirve para el funcionamiento del algoritmo RANDOM
  75.                         *Hay que incluirla en las variables de nuestro programa
  76. *CRLF    DC.B 13,10,0
  77.     END START   ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement