Total, que por una parte quiero la rapidez de ejecución del C/M pero por otro lado, la "seguridad" que da un lenguaje como BASIC, que se conoce y eso. Así que he decidido intentar hacer el software, al menos el de prueba, en C.
Después de probar nosecuántos compiladores de C para 68000 (la mayoría de pago, y por tanto en modo "demo") he conseguido uno que satisface mis espectativas:
- Funciona en Windows
- Tiene IDE integrado
- Produce código relocalizable
- Es gratuito
- Produce archivos binarios (bueno, son S19)
- Permite usar ASM y C en el mismo proyecto.
- Genera archivos ASM editables y listados con código máquina para su inspección
Se llama IDE68K.
http://home.kpn.nl/pj.fondse/ide68k/index.html
¿Conocéis algún otro?
Mi primera prueba con éxito ha sido este programa:
Código: Seleccionar todo
int main (void)
{
_A1 = "Hola, mundo!\n";
_D2 = 13; /* longitud de la cadena */
_D3 = -1; /* timeout */
_A0 = 0x10001; /* canal */
_D0 = 7;
_trap(3);
return 0;
}
Como veis, se puede acceder a algunos recursos de bajo nivel, como los traps, desde C. Este main() necesita de un pequeño código de startup que debe inicializar el registro A5 apuntando a la sección de datos del programa. Dentro de todas las funciones, cualquier referencia a variables globales se hace tomando A5 como base. Entre esto y que el código (los saltos) se compilan de forma relocalizable, lo tenemos todo solucionado (o eso espero).
El código de startup que he añadido al proyecto es sumamente sencillo:
Código: Seleccionar todo
start: lea data(PC),A5
bra _main
section data
align
data equ *
El resultado de todo esto es que ahora puedo dedicarme a programar en C para el QL, sin necesitar al lado el libro de ensamblador del 68000 para cualquier cosa que haga. Esto no quita que una vez que pruebe todas las rutinas de bajo nivel de QLSD, las optimice a ensamblador "puro".
Una vez conseguido esto, ya tengo un printf rudimentario que puedo usar desde el QL para ayudar en la depuración.
Código: Seleccionar todo
int main (void)
{
printf ("Hola, mundo! Esto es una prueba un poco mas larga a ver como sale.\n");
return 0;
}
void printf (char *fmt)
{
int i=0;
char *fmt2=fmt;
while (*fmt2++)
i++;
_A1 = fmt;
_D2 = i;
_D3 = -1;
_A0 = 0x10001;
_D0 = 7;
_trap(3);
}