Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: j4mk3 en 24 de Agosto de 2011, 12:23:07 pm



Título: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: j4mk3 en 24 de Agosto de 2011, 12:23:07 pm
Le estoy dando vueltas a crear unas rutinas compiladas ya en .bin para incluir en los programas. Lo estoy compilando con el asMSX.
Mi idea es distribuir esa .bin y que sea transparente a quien lo quiera usar, facil y sin entrar por dentro...vamos lo que seria una libreria sin pasar el Codigo Fuente. Así seria compilable en cualquier lugar ya fuera C o ASM.
PEERO me he encontrado un problema Gordote.

Resulta que el pack de rutinas tiene saltos. Los saltos absolutos, los paso a relativos, dando algún brinco de rana así en medio del codigo por aquello de no pasar los 128 bytes pa arriba , pa abajo. Pero el problema son los CALL que hay internos dentro.

Claro, un CALL es absoluto...no relativo...en Z80 ASM no encuentro saltos de CALL relativos. No existe la instrucción. Entonces se me ha ocurrido  "simular un CALL" con PUSH, POP y JR....y me encontrado con el problema Gordote:

No puedo acceder al Registro PC para coger su valor :( No existe el PUSH PC ni el POP PC, ni el LD PC,NN ni LD HL,PC ni na de na que toque el Registro PC más que el CALL.
Bueno el RET hace que lo que hay en la pila SP pase a Registro PC...ya hace de LD a Registro PC. Pero leer cargar un el valor actual al del PC....Fuck fuck ! :( no hay [o yo no lo encuentro] ni en las undocumented.

¿Se os ocurre alguna pirueta tecnica para hacer un CALL sin usar el CALL y que se pueda hacer relativo, no absoluto ?


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: SapphiRe_MSX en 24 de Agosto de 2011, 12:34:43 pm
¿Se os ocurre alguna pirueta tecnica para hacer un CALL sin usar el CALL y que se pueda hacer relativo, no absoluto ?

Sin usar CALL no se puede.


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: aorante en 24 de Agosto de 2011, 12:57:07 pm
y hacer un programita que genere un nuevo bin, cambiando esas direcciones absolutas por las adecuadas a partir de una dirección base?


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: pitpan en 24 de Agosto de 2011, 01:52:07 pm
Tienes que hacer un programa que se automodifique. Podría ser algo así:

- Como es un BIN, se cargará entre 8000h y FFFFh (como mucho, claro)
- Ponle una firma al principio del código ("RuTiNa" o lo que tú quieras)
- Que haya una rutina de inicialización que se ejecute buscando la firma, identifique en qué posición está y recalcule así todas las direcciones de CALL y las parchee.

Un follón, vamos, pero si quieres, se puede hacer así. Evidentemente, sólo te funcionará si está en RAM, porque debe automodificarse el propio código del programa.


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: Sd-Snatcher en 24 de Agosto de 2011, 02:45:03 pm
Quizas puedas hacerte una tabla de saltos, donde guardes las direcciones de retorno de cada salto, y antes de saltar decir a que casilla de la tabla hay que usar para volver.


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: SapphiRe_MSX en 24 de Agosto de 2011, 02:57:02 pm
Quizas puedas hacerte una tabla de saltos, donde guardes las direcciones de retorno de cada salto, y antes de saltar decir a que casilla de la tabla hay que usar para volver.

Para eso la tabla de saltos debe estar en una posición fija y conocida de la memoria, que es lo que intenta evitar... También sería necesario para la idea de pitpan. Siempre se debería saber dónde están los datos para acceder a ello. El crear un código totalmente relocalizable en un Z80 no es una tarea sencilla.


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: j4mk3 en 24 de Agosto de 2011, 07:27:13 pm
... El crear un código totalmente relocalizable en un Z80 no es una tarea sencilla.

Hmmmm mmmm  ::) ::) Creo que puedo. Esta frase me está dando una idea y deja de ser el primer NO rotundo, jeje :magicalstones:

Lo que dice @SD-Snacher tambien me parece un camino a seguir...con variaciones.

@pitpan...mmm..la idea es que tambien esté en ROMs y puedan usarse en un MSX1 de poca ram y tal. Pero entiendo lo que dices.

@Aorante, la idea es plug&play que no pase por otro subprograma o aplicativo de PC. Se que tu has hecho este tipo de aplicaciones cuando hemos estado con el ZMA y tal.

Mirando el codigo que quiero empaquetar, los CALL están muy localizados en lugares concretos. Tres de ellos podrian ser perfectamente JR encadenados y que vuelven a la misma posición que salieron, ya que solo se les llama a esos CALL desde un solo lugar. Lo cual el RET podria ser otro JR directo. O bien reordenar el codigo para que fuera todo seguido.

Luego hay 3 puntos que son llamados con CALL desde 4 o 5 puntos contados...Si guardara en una variable un numero ID que indicara desde que lugar pego el salto, luego para volver de la subrtina al punto inicial de llamada consultaria una tabla de saltos relativos (que seguirian un camino de 128 en 128) hasta su posición de donde fue llamado. Sería el ID el que me diría que ruta seguir para volver.

No se si me he explicado bien  :-\ ... la idea es hacer rutas de salto en función desde donde vine. Caminos conocidos que siempre llevarian al mismo punto y que un numero me diria que camino elegir para volver.

Me lo plantearé a boli y os digo que tal lo he implementao.  ;)

Gracias a todos sois geniales !


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: Jon_Cortazar en 26 de Agosto de 2011, 10:38:01 pm
Y, si esas rutinas van a tirar de RAM para sus buffers y datos variables, dicho espacio estaría bien que pudiera ser también reubicable, aunque volverá a ser otro lio de cuyons... salvo que fuerces una zona concreta de RAM y listos, donde el programador deje ese espacio siempre libre para tu paquete de rutinas.

Por otro lado, muy buena idea lo de crear esa especie de rutinas de BIOS extendida: seguro que son de gran ayuda! ;)


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: Metalbrain en 27 de Agosto de 2011, 01:33:34 pm
No puedo acceder al Registro PC para coger su valor :( No existe el PUSH PC ni el POP PC, ni el LD PC,NN ni LD HL,PC ni na de na que toque el Registro PC más que el CALL.
Bueno el RET hace que lo que hay en la pila SP pase a Registro PC...ya hace de LD a Registro PC.

Si tu rutina reubicable va a ser llamada con CALL, siempre podrías hacer algo así:

pop hl            ;dirección de retorno en HL
push hl          ;la volvemos a guardar para que ret funcione
dec hl
ld b,(hl)        ;byte alto
dec hl          
ld c,(hl)        ;byte bajo

Y ya tienes la dirección de comienzo de la rutina en BC, y la puedes usar como base para automodificarla donde necesites.

Citar
Pero el cargar un valor al PC....Fuck fuck ! :( no hay [o yo no lo encuentro] ni en las undocumented.

Cargar un valor al PC es lo más sencillo del mundo: JP


PD: cambiado el código, que había usado una instrucción que no existe.


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: j4mk3 en 27 de Agosto de 2011, 04:26:31 pm
Ei metalbrain...
La rutina que intento que sea reubicable, es llamada con un CALL, sí. Los CALL que tengo que evitar son los que hay por dentro de la rutina en si, que comento en un post superior a este.
Es muy interesante esa manera de pillar el valor del PC. No se me habia ocurrido.

Citar
Cargar un valor al PC es lo más sencillo del mundo: JP
Me he expresado mal. Queria decir "COGER" el valor del PC. Vamos lo que hace tu cachito de codigo. Lo jodido es que para que el valor de PC pase a la pila, solo se puede hacer con CALL y claro...si, lo cogo...pero ande mando el CALL? XD.

Estos de Zilog ¿no pensaron en coger nunca el valor del PC? ¿ Nunca se preguntaron..."¿Por donde voy del Program Counter?"  XD

Aun nohe tenido rato para ponerme a hacer esa rutina reubicable. Sus digo algo cuando lo tenga.


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: j4mk3 en 27 de Agosto de 2011, 04:30:35 pm
Y, si esas rutinas van a tirar de RAM para sus buffers y datos variables, dicho espacio estaría bien que pudiera ser también reubicable,...
Si así es. Es la idea.
Las rutinas solo necesitarán un buffer reservado de N bytes en RAM y ya se lo manejan ellas solas.
Habra una rutina INICIALIZADORA y otra EJECUTADORA.


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: nanochess en 28 de Agosto de 2011, 01:54:27 am
Es posible obtener el valor del PC, aprovechando que ocurren las interrupciones.
Código:
halt
di
dec sp
dec sp
pop hl  ; Ahora hl tiene la dirección de la instrucción siguiente al halt
ei


Título: Re: Hacer CALL without CALL ... mmm ... es posible ?
Publicado por: Iggy Rock en 28 de Agosto de 2011, 05:21:31 pm
Es posible obtener el valor del PC, aprovechando que ocurren las interrupciones.
Código:
halt
di
dec sp
dec sp
pop hl  ; Ahora hl tiene la dirección de la instrucción siguiente al halt
ei

Genial. Apuntado queda.