Número aleatorio 0-100 en Z80

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
Namek
MSX Turbo R
MSX Turbo R
Mensajes: 494
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 5 veces
Gracias recibidas: 13 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor Namek » 02 Ene 2017, 21:15

Luna escribió:llevo años sin tocar basic, pero ahora se me ha ocurrido este bugfix, o si no, caray, quien no se acuerda de sacar numeros aleatorios en BASIC?

No me hagas mucho caso pero me parece que la referencia del titulo del hilo "Z80" se refiere a ensamblador del Z80... aunque puede que este equivocado... :roll:

Avatar de Usuario
explorer
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 7 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor explorer » 02 Ene 2017, 21:24

Pues sí, Namek, se trata de ensamblador. Y la solución no parece muy evidente.

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 3731
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 12 veces
Gracias recibidas: 44 veces
Contactar:

Re: Número aleatorio 0-100 en Z80

Mensajepor jltursan » 02 Ene 2017, 22:43

Prueba con esta:

Código: Seleccionar todo

ld hl,(seed)
ld a,r
ld d,a
ld e,(hl)
add hl,de
add a,l
xor h
ld (seed),hl
ld h,0
ld l,a
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,de
add hl,bc
ld a,h
ret
seed:    dw 0


Te devuelve en A el valor que buscas entre 0-99 (que no 100, no se si eso altera mucho el asunto). Pruebala no sea que haya metido la pata en alguna "tontá" :-)

Avatar de Usuario
explorer
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 7 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor explorer » 04 Ene 2017, 20:55

No habría estado demás que el código estuviese "comentado", con sus puntos y comas ;)

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 3731
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 12 veces
Gracias recibidas: 44 veces
Contactar:

Re: Número aleatorio 0-100 en Z80

Mensajepor jltursan » 04 Ene 2017, 21:17

No habría estado demás que el código estuviese "comentado", con sus puntos y comas


#-o Salió en un arreón :D

La versión en cristiano:

Código: Seleccionar todo

; Rutina para obtener un pseudoaleatorio entre 0-255 en A
; La semilla inicial es 0
ld hl,(seed)
ld a,r
ld d,a
ld e,(hl)
add hl,de
add a,l
xor h
; Guardamos una nueva semilla para aumentar la aleatoriedad la siguiente invocacion
ld (seed),hl
; y almacenamos en HL el valor aleatorio obtenido
ld h,0
ld l,a
; Multiplicamos ese valor por 100
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,de
add hl,bc
; Dividimos por 256 y al tiempo almacenamos en A el valor 0-99
ld a,h
ret
seed:    dw 0


La rutina de obtención de un aleatorio 0-255 no necesita explicación, vale cualquiera de las que pululan por ahí. Lo único que se hace a continuación es multiplicar por 100 y dividir por 256, de esa manera obtenemos el equivalente de haber calculado un aleatorio entre 0 y 1 y haberlo multiplicado por 100.

Avatar de Usuario
explorer
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 7 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor explorer » 04 Ene 2017, 22:51

De acuerdo, se trata entonces de hacer

Código: Seleccionar todo

RND()*100 =
RND()*100 * 256/256 =
RND()*256 * 100/256

valor = RND()*256 se obtiene por medio del generador y la semilla. Queda

Código: Seleccionar todo

valor * 100 / 256 =
(valor*4 + valor*32 + valor*64) / 256 =
byte_alto(valor*4 + valor*32 + valor*64)

El detalle que faltaría, para que fuera exactamente en el rango 0-100, es sumar una vez más el acumulador a hl antes de sacar el byte alto.
Última edición por explorer el 30 Ene 2017, 23:19, editado 1 vez en total.

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 3731
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 12 veces
Gracias recibidas: 44 veces
Contactar:

Re: Número aleatorio 0-100 en Z80

Mensajepor jltursan » 05 Ene 2017, 19:15

Efectivamente, añadiendo A:

Código: Seleccionar todo

; Rutina para obtener un pseudoaleatorio entre 0-255 en A
; La semilla inicial es 0
ld hl,(seed)
ld a,r
ld d,a
ld e,(hl)
add hl,de
add a,l
xor h
; Guardamos una nueva semilla para aumentar la aleatoriedad la siguiente invocacion
ld (seed),hl
; y almacenamos en HL el valor aleatorio obtenido
ld h,0
ld l,a
; Multiplicamos ese valor por 101
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,de
add hl,bc
add a,l
ld l,a
adc a,h
sub l
; En A ya nos queda el valor dividido por 256 entre 0-100
ret
seed:    dw 0


Ya tenemos el rango 0-100 listo :-)

A ver si Uto nos cuenta que tiene entre manos. Viendo el rango no creo que se trate de un analizador de los resultados de la primitiva... :jumper:

Avatar de Usuario
Lord Raptor
Amstrad CPC 464
Amstrad CPC 464
Mensajes: 57
Registrado: 27 Dic 2014, 03:42
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo GameBoy Advance
Primera consola: TV Games/Pong Clone
Gracias recibidas: 1 vez

Re: Número aleatorio 0-100 en Z80

Mensajepor Lord Raptor » 15 Ene 2017, 05:55

Puedes usar el registro R para obtener números aleatorios.
Miembro activo en la demoscene Amiga desde 1993
Miembro activo en la scene del ROMhacking desde 1994

Avatar de Usuario
Namek
MSX Turbo R
MSX Turbo R
Mensajes: 494
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 5 veces
Gracias recibidas: 13 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor Namek » 15 Ene 2017, 11:39

Lord Raptor escribió:Puedes usar el registro R para obtener números aleatorios.

Si, usando por ejemplo un "LD A,R" como se puede ver en el código de ejemplo que hay en el mensaje justo anterior al tuyo... :roll:

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5270
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 5 veces
Gracias recibidas: 26 veces
Contactar:

Re: Número aleatorio 0-100 en Z80

Mensajepor mcleod_ideafix » 15 Ene 2017, 20:21

Lord Raptor escribió:Puedes usar el registro R para obtener números aleatorios.

Para inicializar una semilla de un generador de números aleatorios te puede valer, pero para sacar de forma sistemática números aleatorios es menos eficiente, ya que la secuencia que te saldría sería monotónica, o sea, muy lejos de ser considerada aleatoria.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados