Hola compis!
Estoy programando mis electrochorradas (una librería para hacer ventanas en texto: idea de @Fubukimaru) y me he dado cuenta de que la función que uso para generar números aleatorios es un petardo.
He buscado y no me ha convencido mucho lo que he visto y por estos foros no he encontrado nada.
Probando cambios en la rutina, basándome en el uso del registro R para generar diferentes cálculos (no muy razonados y aplicando estrictamente en el método de prueba y error
), he dado con lo siguiente que aparentemente funciona fine (digo "aparentemente" por que la comprobación ha sido de forma visual).
Lo comparto por si alguien puede ayudar a mejorarla o puede aportar alguna idea para testearla y comprobar si es eficaz.
Pongo la función en C (de SDCC), pero como veréis esta en ensamblador. He puesto unos comentarios con guiones para separar el código principal de la parte necesaria para el assembler-inline de SDCC.
Le paso un parámetro para aplicarlo como máscara y obtener rangos de 0 a 1,3,7,15,31,127 y 255.
Necesita de una valor en RAM (en C definir una variable global), para almacenar el Seed.
char SEED;
char Random(char mask)
{
mask;
__asm
push IX
ld IX,#0
add IX,SP
ld C,4(IX) ;recoge el parametro value para usarlo como mascara
; -----------------------------------------------------------
ld A,(_SEED)
ld B,A
ld A,R
sub A,B
ld A,R
ld L,A
ld H,#0
ld A,(HL)
add A,B
ld B,A
ld A,R
rlca
add A,B
ld (_SEED),A
and C ;aplica la mascara
; -----------------------------------------------------------
ld L,A ;return L
pop IX
__endasm;
}
Referencias:
http://www.cpcwiki.eu/index.php/Programming:Random_Number_Generator