cybernoid
|
|
« : 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
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #1 : 17 de Noviembre de 2008, 12:43:35 pm » |
|
Prueba con push ix pop hl ld de,15 add hl,de O algo similar, claro está
|
|
|
En línea
|
|
|
|
cybernoid
|
|
« Respuesta #2 : 17 de Noviembre de 2008, 12:45:23 pm » |
|
Prueba con push ix pop hl ld de,15 add hl,de O algo similar, claro está jorl! que chungo luego para leerlo, no hay nada mas "claro" de momento usare eso gracias
|
|
|
En línea
|
|
|
|
pitpan
|
|
« Respuesta #3 : 17 de Noviembre de 2008, 12:53:02 pm » |
|
Pues aunque no sea en absoluto óptima, te sugeriría un enfoque directo: 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): 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.
|
|
|
En línea
|
|
|
|
cybernoid
|
|
« Respuesta #4 : 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.
|
|
|
En línea
|
|
|
|
cybernoid
|
|
« Respuesta #5 : 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 EDIT:vale, veo que no se puede accede por separado a IX que capullin soy
|
|
« Última modificación: 17 de Noviembre de 2008, 01:26:38 pm por gobblin »
|
En línea
|
|
|
|
pitpan
|
|
« Respuesta #6 : 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. 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.
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #7 : 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): 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. ld hl,15 ld e,ixl ld d,ixh add hl,de
Una instrucción menos y unos cuantos ciclos menos...
|
|
|
En línea
|
|
|
|
pitpan
|
|
« Respuesta #8 : 17 de Noviembre de 2008, 03:16:01 pm » |
|
No esperábamos menos de ti, Sap!
|
|
|
En línea
|
|
|
|
WYZ
Visitante
|
|
« Respuesta #9 : 17 de Noviembre de 2008, 11:58:32 pm » |
|
LD HL,15 LD SP,IX ADD HL,SP
en tres lineas pero mas heavy destructora aun que la de Robsy.
|
|
« Última modificación: 18 de Noviembre de 2008, 12:12:53 am por WYZ »
|
En línea
|
|
|
|
pitpan
|
|
« Respuesta #10 : 18 de Noviembre de 2008, 10:27:48 am » |
|
Jajaja! No te cargas más registros, pero volatilizas la pila entera...
|
|
|
En línea
|
|
|
|
WYZ
Visitante
|
|
« Respuesta #11 : 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 .
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #12 : 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. 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 La solución de Sapp es mas académica De casta le viene al galgo, ¿verdad?
|
|
|
En línea
|
|
|
|
|