Advertisement
SMicro

RANDOM-SUB

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