Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *-----------------------------------------------------------
- * Title :
- * Written by :
- * Date :
- * Description:
- *-----------------------------------------------------------
- ORG $1000
- START: ; first instruction of program
- * Put program code here
- JSR INIRND ;Inicializa la semilla (SOLO SE LLAMA UNA VEZ POR EJECUCIÓN DE PROGRAMA)
- MOVE.L #NUMEROS,A0
- BUCLE
- MOVE.L #13,D0
- JSR LAB_RND
- ADD.L #1,D0 *Cambia rango de 1 a 14
- CMP.L #10,D0 *Está entre 1 y 10?
- BLS OTRO
- SUB.L #10,D0 *El resto será múltiplo de 25
- MULU #25,D0
- OTRO
- JSR VERNUM
- MOVE.W D0,(A0)+
- CMP.L #NUMEROS+2*5,A0
- BLS BUCLE
- SIMHALT ; halt simulator
- VERNUM
- MOVEM.L D0-D1,-(A7)
- MOVE.L D0,D1
- MOVE.L #3,D0
- TRAP #15
- MOVE.L #6,D0
- MOVE.L #' ',D1
- TRAP #15
- MOVEM.L (A7)+,D0-D1
- RTS
- ***************************************
- 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
- *Hay que incluirla en las variables de nuestro programa
- NUMEROS DS.W 6
- OBJETIVO DS.W 1
- PRNL DS.L 1 *Esta variable global sirve para el funcionamiento del algoritmo RANDOM
- END START ; last line of source
Advertisement
Advertisement