Programación en C para el QL

Subforo oficial del Sinclair QL: realiza aquí las consultas relativas a tu QL.

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Programación en C para el QL

Mensaje por mcleod_ideafix » Vie Abr 22, 2011 6:35 am

Sigo con mis pruebas de la interfaz QLSD. Pensé al principio hacerlas en SuperBASIC pero... uff! Aunque es un BASIC muy avanzado comparado con otros, sigo estando más acostumbrado al C y a su manejo de parámetros.

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);
}
Web: ZX Projects | Twitter: @zxprojects

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Programación en C para el QL

Mensaje por afx » Vie Abr 22, 2011 11:41 am

mcleod_ideafix escribió:¿Conocéis algún otro?

El que yo conozco es el C68 para QDOS, sólo he probado a desarrollar pequeños programas "de juguete".

No tiene ningún IDE, sólo un front-end llamado c68menu para compilar y montar los distintos archivos del proyecto con distintas opciones (para evitar a los principiantes liarse con el make). No recuerdo si tenía la facilidad de integrar ínstrucciones en ensamblador (no lo sé).

Lo que si tiene son algunas librerías específicas para QDOS y SMSQ y es de código libre.

El sitio oficial de C68 es:
http://homepage.ntlworld.com/itimpi/qdosmenu.htm

Hace algún tiempo pasé toda la documentación que viene en formato Quill a PDF para hacerla más manejable. El pdf está aquí:
http://www.speccy.org/sinclairql/archivo/docs/prog/C68.pdf


Ese IDE68K tiene muy buena pinta, no lo conocía.

.

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Programación en C para el QL

Mensaje por radastan » Lun Jun 18, 2012 11:57 am

Bueno, estoy haciendo pruebas yo también con el IDE68K, para ver si me sirve de soporte para hacer juegos.

Para empezar he descubierto un bug interesante. Si creo un proyecto nuevo en C em blanco y tecleo:

void main()
{
}

Al compilar se me jode el editor.

Si cargo cualquier ejemplo en C y reemplazo el código por el que he escrito antes va de perlas... ¿?

¿Alguien lo entiende?

A este ritmo me veo escribiendo en ensamblador, pero es que eso hace que vaya muy lento. ¿Algún otro compilador cruzado aunque sea bajo DOS?
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Programación en C para el QL

Mensaje por mcleod_ideafix » Lun Jun 18, 2012 12:41 pm

radastan escribió:A este ritmo me veo escribiendo en ensamblador, pero es que eso hace que vaya muy lento. ¿Algún otro compilador cruzado aunque sea bajo DOS?


Mira el VBCC. Es un compilador de C que da soporte a varios procesadores, entre ellos, el 68000, pero no sé si tiene opción para producir código relocatable (indispensable en el QL).
http://www.compilers.de/vbcc.html
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Programación en C para el QL

Mensaje por radastan » Lun Jun 18, 2012 3:01 pm

Estoy mirando a realizar la prueba que has puesto, pero aparte de dos warning creo que el compilador este no genera binarios, sólo ficheros ASM. ¿es correcto?

Es decir, ¿debería ensamblar con el Easy68K el fichero asm? es que lo he intentado pero me da error el asm al ensamblarlo con Easy68K.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Programación en C para el QL

Mensaje por mcleod_ideafix » Lun Jun 18, 2012 3:34 pm

No, no. Debería generarte un fichero con extensión HEX, y ese fichero es el que pasas a binario con el EasyBIN. No hay que ensamblar nada.

¿Has creado un proyecto?
Web: ZX Projects | Twitter: @zxprojects

RWAP
rst 0
Mensajes: 19
Registrado: Sab Jun 16, 2012 8:46 am
Ubicación: Stoke-on-Trent, UK
Contactar:

Re: Programación en C para el QL

Mensaje por RWAP » Lun Jun 18, 2012 4:02 pm

For an assembler, you could try as68 which is supplied as part of the C68 package - see http://www.dilwyn.me.uk/c/index.html (C68 runtimes disk 1)

C68 is probably most widely used for the QL now and has built in libraries to enable you to easily access the QDOS routines for graphics, reading the keyboard etc - maybe you could use some of those libraries with the cross C compilers to save time?
RWAP Software
Supporting Sinclair computers since 1986

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Programación en C para el QL

Mensaje por mcleod_ideafix » Mar Jun 19, 2012 4:05 am

radastan escribió:Estoy mirando a realizar la prueba que has puesto, pero aparte de dos warning creo que el compilador este no genera binarios, sólo ficheros ASM. ¿es correcto?


Tienes que hacer lo siguiente:
- Con un editor de texto crea el siguiente archivo. Será nuestro "startup". Llámalo, por ejemplo, "start.asm".

Código: Seleccionar todo

start:     lea data(PC),A5
           bra _main

           section data
           align
data       equ *


- Desde Ide68k, crea un nuevo proyecto (Project - New project). Te aparece una ventanita para insertar ficheros. Dale a "Insert" y busca el fichero start.asm
- Vuelve a insertar otro fichero. Esta vez será un fichero aún inexistente. Vamos a llamarlo.... hola.c
- Ahora debes tener en la ventanita dos ficheros: start.asm y hola.c . ES IMPORTANTE que start.asm sea el primero de los ficheros que haya en tu proyecto.
- Haz clic en hola.c en la ventanita de ficheros de proyecto y pulsa en "Open". Te dirá que no existe y que si hay que crearlo. Le dices que sí, y tienes ya una ventana del editor para programar en C. Escribe este código:

Código: Seleccionar todo

/* Prototipos de funciones que usaremos */
void printf (char *fmt);

/* Funcion principal */
int main (void)
{
    printf ("Hola, mundo!\n");
    return 0;
}

/* El resto de funciones */
void printf (char *fmt)
{
    int i=0;
    char *fmt2=fmt;

    /* Averiguar la longitud de la cadena fmt */
    while (*fmt2++)
        i++;

    /* Seccion 15.3 del QDOS SMS Reference Manual: escribir multiples bytes a un canal */
    _A1 = fmt;  /* Puntero al comienzo de los bytes */
    _D2 = i;  /* Numero de bytes */
    _D3 = -1; /* Timeout */
    _A0 = 0x10001; /* Channel ID */
    _D0 = 7; /* función IOB.SMUL */
    _trap(3);
}


- Antes de compilar por primera vez, vamos a especificar dónde queremos los ficheros de salida. Ve a "Options -> Directories" y elige cuál va a ser el "Default directory". Es decir, el directorio donde se crearán los ficheros compilados. Por ejemplo, que sea el mismo donde tienes estos ficheros de código fuente, o un directorio que tengas compartido con el Q-Emulator.
- En "Project -> Properties" ve a la pestaña "C Compiler". Marca la casilla "relocatable code" y desmarca la casilla "Use register based variables".
- Graba el proyecto con Shift-F5.
- Pulsa F7 para compilarlo todo.
- Si no ha habido errores, deberás tener un fichero HEX en el directorio "default" que hayas especificado.
- Arranca el EasyBIN (el programa de conversión de ficheros que viene de serie con Easy68K). Pulsa Ctrl-O para abrir un fichero. Especifica como tipo "Other S-Record" y carga tu archivo HEX
- Pulsa Ctrl-S y dale un nombre de fichero al binario resultante. Recuerda NO ponerle punto, para que el QL lo "vea" bien.

En Q-Emulator / QL real
- Si usas la ROM "normal", haz primero un RESPR de la cantidad de bytes adecuada (el tamaño del fichero binario resultante). Carga con LBYTES el fichero, y haz un CALL a la dirección inicial dada en RESPR
- Si usas el Toolkit 2 y tienes por tanto la orden LRESPR, simplemente haz LRESPR nombre_de_tu_binario
- Devuelve el saludo a tu QL :)
Web: ZX Projects | Twitter: @zxprojects

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 12 invitados