Karoshi MSX Community
06 de Julio de 2021, 12:52:30 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Hacer CALL without CALL ... mmm ... es posible ?  (Leído 5583 veces)
0 Usuarios y 1 Visitante están viendo este tema.
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« : 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 Sad 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 ! Sad 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 ?
« Última modificación: 27 de Agosto de 2011, 04:28:29 pm por j4mk3 » En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
SapphiRe_MSX
Visitante
« Respuesta #1 : 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.
En línea
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #2 : 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?
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #3 : 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.
En línea
Sd-Snatcher
Karoshi Lover
***
Mensajes: 141


popolon@hotmail.com
Email
« Respuesta #4 : 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.
En línea
SapphiRe_MSX
Visitante
« Respuesta #5 : 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.
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #6 : 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  Roll Eyes Roll Eyes Creo que puedo. Esta frase me está dando una idea y deja de ser el primer NO rotundo, jeje Magical Stones

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  Undecided ... 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.  Wink

Gracias a todos sois geniales !
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #7 : 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! Wink
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Metalbrain
Karoshi Fan
**
Mensajes: 92


Z80jutsushi


« Respuesta #8 : 27 de Agosto de 2011, 01:33:34 pm »

No puedo acceder al Registro PC para coger su valor Sad 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 ! Sad 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.
« Última modificación: 27 de Agosto de 2011, 01:36:18 pm por Metalbrain » En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #9 : 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.
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #10 : 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.
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
nanochess
Karoshi Lover
***
Mensajes: 141


Programando algo buenísimo :)


WWW
« Respuesta #11 : 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
En línea

Mira mis juegos MSX/Colecovision/Atari/Intellivision http://nanochess.org/retro_es.html, y sígueme en Twitter http://twitter.com/nanochess
Iggy Rock
Visitante
« Respuesta #12 : 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.
En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!