Estoy intentando calcular el incremento de x e y para mover un disparo por la pantalla desde unas coordenadas fijas hasta otras dadas por la x e y ocupadas por otro sprite, pero estoy atascado.
Veamos. El tema clave está en la pregunta "¿en cuántos pasos quieres que el disparo recorra su camino?". Lo mejor sería moverlo en un número de pasos que fuese potencia de dos, ya que como el Z80 no permite dividir fácilmente por otros números ya empezaríamos a liarla parda.
Partamos del hecho de que tienes un incremento IX y otro incremento IY (no confundir con los registros de igual nombre que pululan por el Z80). Supongamos, además, que quieres hacer 2^k pasos, por lo que tienes que dividir entre 2^k, lo que equivale a desplazar k veces hacia la derecha. Bien, la idea sería en cada uno de los 2^k pasos sumar el incremento (para cada coordenada) dividido por 2^K, con lo que al final del proceso el resultado será que se ha sumado el incremento total y el disparo llega a su destino.
¿Cómo tratar los decimales en el Z80? Con números de 16 bits. Pensemos que un número de 16 bits puede ser visto como un valor entre 0 y 65535 si lo vemos como un número entero, pero si pensamos que está formado por 8 bits de parte entera y 8 bits de parte decimal (8.8 para abreviar), entonces podremos representar un número entre 0 y 255+255/256. Realmente ambos casos son iguales, simplemente el segundo equivale a dividir por 256 el primero, nada más.
Así pues el procedimiento sería (pongo partes en pseudocódigo ya que ahora voy algo justo de tiempo):
ld h,incremento
ld l,0
así hl (visto como decimal 8.
contendría el incremento
rotar hl hacia la derecha k veces
obteniendo así el incremento dividido por 2^k en hl
ld [incremento],hl
guardando el incremento en una variable en memoria que representa un valor 8.8
ld h,coordenadainicial
ld l,0
lo mismo para la coordenada inicial
ld [coordenadaactual],hl
que la guardamos en una variable en memoria que también ha de ser vista como un valor 8.8. Con esto ya tenemos la inicialización completa (obviamente calcularemos incremento y coordenada inicial para cada dimensión). Luego, a cada paso:
ld hl,[coordenadaactual]
ld de,[incremento]
add hl,de
ld [coordenadaactual],hl
y ya tenemos la coordenada actual actualizada (valga la redundancia). Como el Z80 almacena siempre primero el byte de menor peso, nos bastaría con acceder al contenido de coordenadaactual+1 para saber la parte entera de la coordenada actual, que es el valor que hay que poner en la coordenada del sprite.
Espero que esta explicación pueda despejar tus dudas. Obviamente esto puede extenderse y trabajar con números 4.4 que caben en un byte, o incluso con números 3.5, 13.3, etc. Todo un mundo de posibilidades que dependen de cómo miremos los números.
Un saludo
--
Sph.