Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cursos:ensamblador:aritmetica [24-01-2024 11:55] – [Enlaces] sromero | cursos:ensamblador:aritmetica [02-02-2024 10:12] (actual) – [Números aleatorios] sromero | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Aritmética con el Z80 ====== | ====== Aritmética con el Z80 ====== | ||
- | El Z80 nos provee de funciones aritméticas de 8 bits básicas, como son '' | + | El Z80 nos provee de funciones aritméticas de 8 bits básicas, como son '' |
En muchas de estas operaciones toma especial relevancia '' | En muchas de estas operaciones toma especial relevancia '' | ||
Línea 11: | Línea 11: | ||
En este capítulo vamos a ver rutinas para realizar este tipo de operaciones extraídas de diferentes fuentes (libros, webs dedicadas al Z80, foros de desarrollo, canales de discusión sobre programación en ensamblador), | En este capítulo vamos a ver rutinas para realizar este tipo de operaciones extraídas de diferentes fuentes (libros, webs dedicadas al Z80, foros de desarrollo, canales de discusión sobre programación en ensamblador), | ||
- | En algunas ocasiones se incluirán comentarios sobre cómo opera esta rutina, y en otras simplemente citaremos la rutina con sus parámetros de entrada y salida para poder usarla en nuestros programas. Para toda rutina, se citará la fuente de la que se ha extraído si es conocida, y su autor (si es posible) para darle sus merecido crédito por ella. | + | En algunas ocasiones se incluirán comentarios sobre cómo opera esta rutina, y en otras simplemente citaremos la rutina con sus parámetros de entrada y salida para poder usarla en nuestros programas. Para toda rutina, se citará la fuente de la que se ha extraído si es conocida, y su autor (si es posible) para darle su merecido crédito por ella. |
- | Las rutinas se reproducen tal cual aparecen en la web, por lo que es posible que alguna de ellas incluyan '' | + | Las rutinas se reproducen tal cual aparecen en la web, por lo que es posible que alguna de ellas incluyan |
Se recomienda al lector que se desarrolle su propia librería '' | Se recomienda al lector que se desarrolle su propia librería '' | ||
Línea 47: | Línea 47: | ||
ld b, 0 | ld b, 0 | ||
ld c, a | ld c, a | ||
- | | + | |
| | ||
; Sumas de registros de 8 bits a registros de 16 bits: OPCION 2 | ; Sumas de registros de 8 bits a registros de 16 bits: OPCION 2 | ||
Línea 163: | Línea 163: | ||
</ | </ | ||
- | Si hubiéramos necesitado multiplicar por 21 o por 19 (por ejemplo), podríamos haber guardado el valor de A antes de este proceso (por ejemplo en el registro C) y haber después sumado o restado C a la multiplicación por 20 para encontrar el valor deseado. Para multiplicar por 22 o por 18 podríamos haberlo sumado restado 2 veces al resultado, etc. | + | Si hubiéramos necesitado multiplicar por 21 o por 19 (por ejemplo), podríamos haber guardado el valor de A antes de este proceso (por ejemplo en el registro C) y haber después sumado o restado C a la multiplicación por 20 para encontrar el valor deseado. Para multiplicar por 22 o por 18 podríamos haberlo sumado |
Pero volvamos a '' | Pero volvamos a '' | ||
Línea 172: | Línea 172: | ||
</ | </ | ||
- | Al igual que pasaba con '' | + | Al igual que pasaba con '' |
Por ejemplo: | Por ejemplo: | ||
Línea 203: | Línea 203: | ||
\\ **Dividiendo por potencias de dos**\\ | \\ **Dividiendo por potencias de dos**\\ | ||
- | Del mismo modo que desplazar a la izquierda es multiplicar, | + | Del mismo modo que desplazar a la izquierda es multiplicar, |
<code z80> | <code z80> | ||
Línea 449: | Línea 449: | ||
De la misma forma que se puede multiplicar con múltiples sumas, también podemos dividir de forma poco eficiente con múltiples restas. | De la misma forma que se puede multiplicar con múltiples sumas, también podemos dividir de forma poco eficiente con múltiples restas. | ||
- | Sin embargo, como ocurría con la multiplicación, | + | Sin embargo, como ocurría con la multiplicación, |
- | Mostraremos a continuación | + | Mostraremos a continuación |
\\ | \\ | ||
Línea 591: | Línea 591: | ||
Si hay una funcionalidad que necesitaremos casi con total seguridad para desarrollar un juego es la posibilidad de generar números aleatorios. Si queremos que cada partida sea diferente y que ciertas acciones varíen (como por ejemplo, que en un juego de puzzle no aparezcan siempre las mismas piezas), necesitaremos una fuente de aleatoriedad, | Si hay una funcionalidad que necesitaremos casi con total seguridad para desarrollar un juego es la posibilidad de generar números aleatorios. Si queremos que cada partida sea diferente y que ciertas acciones varíen (como por ejemplo, que en un juego de puzzle no aparezcan siempre las mismas piezas), necesitaremos una fuente de aleatoriedad, | ||
- | Hay varias formas de generar números aleatorios. La primera de ella es utilizar funciones matemáticas que nos devuelve | + | Hay varias formas de generar números aleatorios. La primera de ella es utilizar funciones matemáticas que nos devuelven |
Veamos una rutina muy simple (extraída de la página //Z80 bits//, de //Milos Bazelides// | Veamos una rutina muy simple (extraída de la página //Z80 bits//, de //Milos Bazelides// | ||
Línea 615: | Línea 615: | ||
</ | </ | ||
- | la rutina utiliza una semilla (RAND_SEED) que inserta en el registro A para realizar una serie de operaciones y generar el siguiente valor de la serie en A. | + | La rutina utiliza una semilla (RAND_SEED) que inserta en el registro A para realizar una serie de operaciones y generar el siguiente valor de la serie en A. |
Al final de la rutina podemos ver cómo hay una instrucción '' | Al final de la rutina podemos ver cómo hay una instrucción '' | ||
Línea 638: | Línea 638: | ||
</ | </ | ||
- | De la misma forma, la siguiente rutina proporciona un número aleatorio de 16 bits, lo cual hace que la serie de | + | De la misma forma, la siguiente rutina proporciona un número aleatorio de 16 bits, lo cual hace que la serie de posibles resultados sea mucho mayor (65535 valores) antes de volver a repetir valores de la secuencia. |
\\ | \\ | ||
Línea 677: | Línea 677: | ||
Aparte de estos 2 ejemplos, hay gran cantidad de rutinas que proporcionan números aleatorios por diferentes métodos. | Aparte de estos 2 ejemplos, hay gran cantidad de rutinas que proporcionan números aleatorios por diferentes métodos. | ||
- | Una rutina bastante rápida, es la basada en el algoritmo '' | + | Una rutina bastante rápida es la basada en el algoritmo '' |
+ | |||
+ | Este algoritmo es el usado por, entre otros, la rutina '' | ||
<code z80> | <code z80> | ||
Línea 694: | Línea 696: | ||
; some alternative shift triplets which also perform well are: | ; some alternative shift triplets which also perform well are: | ||
; 6, 7, 13; 7, 9, 13; 9, 7, 13. | ; 6, 7, 13; 7, 9, 13; 9, 7, 13. | ||
- | xrnd: | + | |
- | ld hl, 1 ; initial seed must not be 0 | + | SRAND_SEED |
+ | |||
+ | srand: | ||
+ | ld hl, SRAND_SEED | ||
ld a, h | ld a, h | ||
rra | rra | ||
Línea 710: | Línea 715: | ||
xor h | xor h | ||
ld h, a | ld h, a | ||
- | ld (xrnd+1), hl ; Self-modifying code (alter seed) | + | ld (srand+1), hl ; Código automodificable: |
+ | ; cambiamos la semilla de la primera línea | ||
+ | ; de la subrutina, por el último valor | ||
+ | ; obtenido. | ||
ret | ret | ||
+ | | ||
+ | ; HL = semilla a utilizar para srand | ||
+ | SetSrandSeed: | ||
+ | ld (srand+1), hl ; Establecemos semilla HL | ||
+ | ret | ||
+ | | ||
</ | </ | ||
\\ | \\ | ||
Línea 839: | Línea 853: | ||
\\ | \\ | ||
- | En realidad, podríamos | + | En realidad, podríamos |
\\ | \\ |