Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: aorante en 03 de Agosto de 2018, 12:33:17 pm



Título: Generador Random de números de 8bits
Publicado por: aorante en 03 de Agosto de 2018, 12:33:17 pm
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.


Código:
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


Título: Re:Generador Random de números de 8bits
Publicado por: Tragamanzanas en 13 de Agosto de 2018, 07:51:59 pm
No te puedo ayudar ya que mi nivel no es muy elevado y hace tiempo que no práctico ensamblador :(
Pero creo recordar que yo también necesite programar números aleatorios y encontré varias formas, pero no me acuerdo donde. Lo buscaré haber si hay suerte.


Título: Re:Generador Random de números de 8bits
Publicado por: aorante en 15 de Agosto de 2018, 11:16:37 am
La rutina anterior no funciona.
En la aplicación que utilizo para testear, funcionaba bien pero le añadí unas lineas que mostraban un texto y ahora entra en un patrón de repetición. Este efecto me pasaba con versiones anteriores y pensaba que lo había solucionado, pero veo que es muy frágil.
Lo he probado en los emuladores bluemsx y meisei, y pasa lo mismo aunque el patrón es diferente.
Habrá que seguir investigando...  ;)

Gracias @Tragamanzanas


Título: Re:Generador Random de números de 8bits
Publicado por: aorante en 21 de Agosto de 2018, 05:27:06 pm
Acabo de publicar en GitHub las aplicaciones que he realizado para probar la rutina/función para generar números aleatorios.
Están a vuestra disposición!  ;)

https://github.com/mvac7/SDCC_test_Z80PRNG

En breve intento publicar aquí una memoria de la experiencia por si alguien puede ayudar a corregir cosas que se me hayan pasado por alto o mejorar lo hecho.