Karoshi MSX Community
16 de Agosto de 2018, 02:38:36 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Generador Random de números de 8bits  (Leído 108 veces)
0 Usuarios y 1 Visitante están viendo este tema.
aorante
Karoshi Maniac
****
Mensajes: 450


nuTella Power!


WWW Email
« : 03 de Agosto de 2018, 12:33:17 pm »

Hola compis!  Wink

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 Wink ), 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
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
Tragamanzanas
Karoshi Fan
**
Mensajes: 68


« Respuesta #1 : 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 Sad
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.
En línea
aorante
Karoshi Maniac
****
Mensajes: 450


nuTella Power!


WWW Email
« Respuesta #2 : 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...  Wink

Gracias @Tragamanzanas
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!