Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: cybernoid en 17 de Noviembre de 2008, 12:35:07 pm



Título: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: cybernoid en 17 de Noviembre de 2008, 12:35:07 pm
Hola,

Pues estaba yo tan contento utilizando registros indice cuando me encuentro con esta pequeña dificultad, necesito pasar igualar la dirección de HL con IX+15  ¿como podria hacer esto?


asias :)


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: SapphiRe_MSX en 17 de Noviembre de 2008, 12:43:35 pm
Prueba con

Código:
push ix
pop hl
ld de,15
add hl,de

O algo similar, claro está :D


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: cybernoid en 17 de Noviembre de 2008, 12:45:23 pm
Prueba con

Código:
push ix
pop hl
ld de,15
add hl,de

O algo similar, claro está :D


jorl! que chungo luego para leerlo, no hay nada mas "claro"

de momento usare eso :D gracias :)


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: pitpan en 17 de Noviembre de 2008, 12:53:02 pm
Pues aunque no sea en absoluto óptima, te sugeriría un enfoque directo:

Código:
push bc ; suponiendo que nos conviene mantener el valor original de BC
push ix
pop hl
ld bc,15
add hl,bc
pop bc ; recuperamos el valor original de BC

Así a ojo, 10 bytes de código y un montón de ciclos. Y que conste que no me gusta nada usar la pila, pero es lo que hay cuando tratamos de combinar HL y registros índice. La otra opción, si puedes usar el registro DE, es tratar de ir por el camino del medio con los registros IXh y IXl.

De todos modos, estoy seguro de que puedes encontrar una alternativa mejor a ese LD HL,IX+15

Creo que sin muchas dificultades se puede hacer también un ADD IX,BC si no necesitas conservar el registro original.

Versión heavy destructora de registros (machaca BC y DE, que podrían protegerse vía pila):

Código:
ld bc,15
ld e,ixl
ld d,ixh
ex de,hl
add hl,bc

Esta versión ocupa otros 10 bytes, pero no usa la pila.

En fin. Dadle caña. Seguro que Sap nos recorta unos cuantos ciclos e instrucciones.


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: cybernoid en 17 de Noviembre de 2008, 01:04:32 pm
Bueno, intentare buscar una alternativa, lo que pasa es que IX e IY van de coña para mirar propiedades de un objeto, pero claro, llega un momento en que almaceno las animaciones del objeto en un array y queria pasarle a HL un "puntero" para patearmelo.

pero me buscare otra solución, creo que sera lo mejor :)

gracias.



Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: cybernoid en 17 de Noviembre de 2008, 01:06:34 pm
por cierto
otra solución seria

ld a,i
ld h,i
ld a,x
ld l,x
ld de,15
add hl,de

¿no?



se me acaba de ocurrir  :P


EDIT:vale, veo que no se puede accede por separado a IX :P que capullin soy


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: pitpan en 17 de Noviembre de 2008, 01:31:25 pm
El nombre de los registros de 8 bits que salen de IX son IXL (low) y IXH (high). El registro I es algo totalmente diferente y que no tiene que ver con los registros índice.

En cualquier caso, el problema que tienes es que no hay forma de combinar los registros HL, H y L con los registros IX, IXH y IXL en una misma instrucción. Si analizas los opcodes de estas instrucciones, verás que cuando empiezan por EDh se transforma HL por IX. Por lo tanto, una misma instrucción no puede tener acceso a ambos a la vez. No sé si me he explicado, pero vamos, la conclusión es que no se puede. Las instrucciones como LD H,IXH no existen en este universo, salvo error u omisión. :P

Conclusiones: usar IX e IY con moderación. Todas las instrucciones que operan con ellos son, en principio, un byte más largas y además, como no, más lentas. Usar con moderación y en casos en los que esté plenamente justificado. En donde sea posible, hay que buscar la mejor solución con los registros estándar.


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: SapphiRe_MSX en 17 de Noviembre de 2008, 02:26:07 pm
Versión heavy destructora de registros (machaca BC y DE, que podrían protegerse vía pila):

Código:
ld bc,15
ld e,ixl
ld d,ixh
ex de,hl
add hl,bc

Esta versión ocupa otros 10 bytes, pero no usa la pila.

En fin. Dadle caña. Seguro que Sap nos recorta unos cuantos ciclos e instrucciones.

Código:
ld hl,15
ld e,ixl
ld d,ixh
add hl,de

Una instrucción menos y unos cuantos ciclos menos... ;D ;D ;D


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: pitpan en 17 de Noviembre de 2008, 03:16:01 pm
No esperábamos menos de ti, Sap!  :D


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: WYZ en 17 de Noviembre de 2008, 11:58:32 pm
Código:

LD HL,15
LD SP,IX
ADD HL,SP


en tres lineas pero mas heavy destructora aun que la de Robsy.


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: pitpan en 18 de Noviembre de 2008, 10:27:48 am
Jajaja! No te cargas más registros, pero volatilizas la pila entera... ;D


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: WYZ en 18 de Noviembre de 2008, 05:42:09 pm
jeje, guardando el puntero de la pila no habría problema no? :) . No suelo usar SP, porque la fijo al inicio del programa y me olvido si no da problemas, pero puede ser una solución rápida para hacer de puente entre los registros de 16 bits. La solución de Sapp es mas académica ;D.


Título: Re: LD HL,IX+15 ??? ES POSIBLE?
Publicado por: SapphiRe_MSX en 18 de Noviembre de 2008, 06:00:22 pm
jeje, guardando el puntero de la pila no habría problema no? :)

Pero ocuparía más memoria y tardaría más.

Citar
No suelo usar SP, porque la fijo al inicio del programa y me olvido si no da problemas

Uuuuh... yo tengo una variable de memoria donde guardo el puntero de la pila cuando la necesito para hacer cosas rápidas. Un push a veces soluciona muchos problemas :D

Citar
La solución de Sapp es mas académica ;D

De casta le viene al galgo, ¿verdad? ;D