Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- * Description:
- * Este programa genera números pseudoaleatorios mediante el algoritmo de Galois.
- * Se toma como semilla el número de centésimas de segundo desde medianoche, que se
- * obtiene con la TASK 8
- * Consiste en dos subrutinas, una de ellas SE LLAMA SOLO UNA VEZ (INIRND) al
- * comienzo del programa y se genera la semilla inicial a partir de las centésimas de
- * de segundo del reloj.
- * La otra subrutina (LAB_RND) devuelve en D0 un valor pseudoaleatorio escalado
- * entre 0 y RANGO (valor máximo) cada vez que se le llama. El valor máximo del RANGO
- * se le ha de asignar al mismo D0 antes de hacer la llamada JSR LAB_RND.
- * Si se desea usar rangos que no partan de 0, se puede sumar el valor inicial deseado
- * al número obtenido.
- * _________________________________________________________________________________________
- ORG $1000
- RANGO EQU 10
- ***************** Este bloque es solo para probar el generador de números aleatorios
- ***************** Hacemos llamadas a la subrutina con RANGO=10 y presentamos el resultado
- ***************** obtenido
- START
- JSR INIRND ;Inicializa la semilla (SOLO SE LLAMA UNA VEZ POR EJECUCIÓN DE PROGRAMA)
- NEWLIN MOVE.L #30,D2 ;30 números por línea
- OTRO MOVE.L #RANGO,D0
- JSR LAB_RND ;Obtiene un valor entre 0-RANGO
- MOVE.L D0,D1
- MOVE.L #3,D0 ;Presenta número obtenido
- TRAP #15
- MOVE.L #5,D0 ;Espera pulsa tecla
- TRAP #15
- SUB.L #1,D2
- BNE OTRO
- MOVE.L #6,D0
- MOVE.L #10,D1
- TRAP #15
- MOVE.L #13,D1
- TRAP #15 ;Salta a otra línea
- JMP NEWLIN
- ***************************************
- INIRND *Esta subrutina inicializa la semilla (variable PRNL) a partir del reloj
- MOVE.L #8,D0
- TRAP #15
- MOVE.L D1,PRNL *En D1 obtenemos las centesimas de segundo desde media noche que asignamos a PRNL
- RTS
- ***************************************
- ******** ALGORITMO (Necesita haber inicializado previamente la semilla, PRNL, con un long)
- ******** (Devuelve en D0 un valor pseudoaleatorio del Rango deseado)
- LAB_RND MOVEM.L D1-D3,-(A7) ;guarda en la pila los registros utilizados
- MOVE.L D0,D1
- ADD.L #1,D1 * calculamos el rango para un valor más (luego lo eliminamos)
- MOVE.L #$FFFF,D0
- DIVU D1,D0 * obtiene el factor de escala rango
- AND.L #$FFFF,D0 * elimina resto
- ADD.L #1,D0 * sumamos 1 al factor de escala para eliminar el posible valor de más
- MOVE.L D0,D3 * pasamos factor de escala a D3 que será el número por el que habrá que dividir
- MOVE.L PRNL,D0 * get current seed longword
- MOVEQ #$AF-$100,d1 * set EOR value
- MOVEQ #19,d2 * do this 19 times
- Ninc0
- ADD.L d0,d0 * shift left 1 bit
- BCC.S Ninc1 * if bit not set skip feedback
- EOR.B D1,D0 * do Galois LFSR feedback
- Ninc1
- SUBQ #1,D2
- BNE Ninc0 * loop
- MOVE.L D0,PRNL * save back to seed longword
- SWAP D0 ;Obtiene la palabra alta
- AND.L #$FFFF,D0 ;Se queda con esa palabra 0-65535
- DIVU D3,D0 ;aplicamos factor de escala
- AND.L #$FFFF,D0 ;Se queda solo con el cociente (solo 16 bits)
- MOVEM.L (A7)+,D1-D3
- RTS
- **************DATOS*********************
- ORG $2000
- PRNL DS.L 1 *Esta variable global sirve para el funcionamiento del algoritmo RANDOM
- *Hay que incluirla en las variables de nuestro programa
- END START ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement