Advertisement
SMicro

GENERADOR NÚMEROS DEL JUEGO CIFRAS

Apr 29th, 2024 (edited)
901
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *-----------------------------------------------------------
  2. * Title      :
  3. * Written by :
  4. * Date       :
  5. * Description:
  6. *-----------------------------------------------------------
  7.     ORG    $1000
  8. START:                 ; first instruction of program
  9.  
  10. * Put program code here
  11.  
  12.     JSR INIRND    ;Inicializa la semilla (SOLO SE LLAMA UNA VEZ POR EJECUCIÓN DE PROGRAMA)
  13.  
  14.     MOVE.L #NUMEROS,A0
  15. BUCLE
  16.    MOVE.L #13,D0
  17.     JSR LAB_RND
  18.     ADD.L #1,D0  *Cambia rango de 1 a 14
  19.     CMP.L #10,D0 *Está entre 1 y 10?
  20.     BLS OTRO
  21.     SUB.L #10,D0 *El resto será múltiplo de 25
  22.     MULU #25,D0
  23. OTRO
  24.     JSR VERNUM
  25.     MOVE.W D0,(A0)+
  26.     CMP.L #NUMEROS+2*5,A0
  27.     BLS BUCLE
  28.    
  29.     SIMHALT             ; halt simulator
  30.            
  31.      
  32. VERNUM
  33.    MOVEM.L D0-D1,-(A7)
  34.     MOVE.L D0,D1
  35.     MOVE.L #3,D0
  36.     TRAP #15
  37.     MOVE.L #6,D0
  38.     MOVE.L #' ',D1
  39.     TRAP #15
  40.     MOVEM.L (A7)+,D0-D1
  41.     RTS
  42.  
  43. ***************************************
  44. INIRND               *Esta subrutina inicializa la semilla (variable PRNL) a partir del reloj
  45.         MOVE.L  #8,D0
  46.         TRAP    #15
  47.         MOVE.L D1,PRNL *En D1 obtenemos las centesimas de segundo desde media noche que asignamos a PRNL
  48.         RTS
  49. ***************************************
  50.    
  51. ******** ALGORITMO  (Necesita haber inicializado previamente la semilla, PRNL, con un long)
  52. ********            (Devuelve en D0 un valor pseudoaleatorio del Rango deseado)
  53.  
  54. LAB_RND MOVEM.L D1-D3,-(A7) ;guarda en la pila los registros utilizados
  55.         MOVE.L D0,D1
  56.         ADD.L #1,D1       * calculamos el rango para un valor más (luego lo eliminamos)
  57.         MOVE.L #$FFFF,D0
  58.         DIVU D1,D0        * obtiene el factor de escala rango
  59.         AND.L #$FFFF,D0   * elimina resto
  60.         ADD.L #1,D0       * sumamos 1 al factor de escala para eliminar el posible valor de más
  61.         MOVE.L D0,D3      * pasamos factor de escala a D3 que será el número por el que habrá que dividir
  62.        
  63.         MOVE.L  PRNL,D0             * get current seed longword
  64.         MOVEQ       #$AF-$100,d1    * set EOR value
  65.         MOVEQ       #19,d2          * do this 19 times
  66. Ninc0
  67.        ADD.L       d0,d0           * shift left 1 bit
  68.         BCC.S       Ninc1           * if bit not set skip feedback
  69.  
  70.         EOR.B       D1,D0           * do Galois LFSR feedback
  71. Ninc1
  72.        SUBQ #1,D2
  73.         BNE         Ninc0           * loop
  74.  
  75.         MOVE.L  D0,PRNL     * save back to seed longword
  76.    
  77.         SWAP D0      ;Obtiene la palabra alta
  78.         AND.L #$FFFF,D0  ;Se queda con esa palabra 0-65535
  79.        
  80.         DIVU D3,D0       ;aplicamos factor de escala    
  81.         AND.L #$FFFF,D0  ;Se queda solo con el cociente (solo 16 bits)
  82.         MOVEM.L (A7)+,D1-D3
  83.         RTS
  84.        
  85. **************DATOS*********************        
  86.        
  87.         ORG $2000      
  88.        
  89.                         *Hay que incluirla en las variables de nuestro programa
  90. NUMEROS DS.W 6
  91. OBJETIVO DS.W 1
  92. PRNL   DS.L 1          *Esta variable global sirve para el funcionamiento del algoritmo RANDOM
  93.                        
  94.         END START   ; last line of source
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement