martes, 13 de abril de 2010

Hello World


Para mi primer programa con SDCC, me he propuesto hacer el clásico "Hello World" en una ROM. Primeramente he de agradecer el tutorial de Nerlaska para la creación de ROMs y la información de Andrear. En el código podéis encontrar funciones de acceso al VDP, de ambos. También he usado el nMSXtiles de Pentacour, para crear el tileset de la fuente, que para su conversión a código C, me he apoyado de una utilidad que he creado. Para simplificar la compilación y del proceso de creación de la ROM, también he desarrollado una utilidad con una interfaz gráfica. Cuando estén más estables las compartiré con vosotros.

En el desarrollo me encontré con problemas al insertar los datos de la fuente utilizando muchos arrays de chars. El fichero resultante era muy grande y además al ejecutarlo daba errores. He aprendido que cuando se trabaja con bloques muy grandes de datos, como es el caso de los gráficos, es mejor añadirlo en un único array de char (uno para los patrones, otro para los colores y otro para los nombres de patrones). Además para mi sorpresa, el compilador SDCC comprime los datos repetidos, que para este caso se aprovecha bastante. Es un sistema similar al RLE, pero que afecta únicamente a series de valores repetidos.

El programa es muy simple. Primero llena la pantalla del tile 32, para que no se vea como se escriben los gráficos en la VRAM, que aunque es rápido no es tanto como en assembler. Luego lleno la tabla de colores con el color que uso para la fuente (blanco con fondo azul). Para estas dos tareas utilizo una sencilla función en assembler de Nerlaska que es muy rápida (VDP_FillVRAM). Después copio los datos gráficos (del tileset), a los tres bancos de la pantalla (con vpoke_block). En el siguiente paso pongo los textos en la pantalla con una función a la cual indico la posición de la pantalla y el texto (vprint, esta es mía ;D ). Para finalizar espero la pulsación de una tecla (llamada a la bios CHGET-h009F), y después reinicio el ordenador.

Para compilar, he utilizado la siguiente sentencia (al resultado faltaría aplicarle el hex2bin y convertirlo en una ROM de 16k):
sdcc -mz80 --no-std-crt0 --code-loc 0x4010 --data-loc 0xC000 HelloSC2.c

7 comentarios:

  1. Interesante esta serie de artículos. Aunque ahora mismo prefiero programar en assembler, alguna vez me ha hecho gracia probar algo en c, pero me daba cierta pereza ponerme a pelear con ello y a intentar solucionar problemillas que pudieran surgir. Con estos artículos ya no tendré excusa ;)

    ResponderEliminar
  2. La verdad es que los principios siempre cuestan. Yo todavía veo un largo camino hasta poder dominar esto... ;)

    ResponderEliminar
  3. Para mejorar la integridad de la información, propongo añadir en el blog (o en el comentario) la línea de comando exacta que ha usado para compilar los fuentes (sdcc -mz80 ...).

    aorante, estoy siguiendo tu blog(s) con gusto, buen trabajo.

    ResponderEliminar
  4. Gracias Andrear!
    Te he hecho caso y he aprovechado para añadir un poco más de información, como los nombres de algunas de las funciones que he utilizado.

    Las gracias te las he de dar a ti, ya que tu proyecto trabajo me esta ayudando mucho! :D

    ResponderEliminar
  5. He descubierto un truco interesante por los bloques de código ensamblador en linea (__asm/__endasm): estos pueden hacer advertencias, pueden ser silenciadas mediante #pramga save + #pragma disable_warning + (your function) + #pragma restore. http://sdcc.sourceforge.net/doc/sdccman.html/node100.html (observación: "Pragmas should be placed before and/or after a function, placing pragmas inside a function body could have unpredictable results")

    ResponderEliminar
  6. Gracias!
    Lo probaré. Yo he utilizado el método de Nerlaska de poner el nombre de las variables al inicio, pero en las funciones con salida sigue sacando el molesto warning. :P

    ResponderEliminar
  7. Hombre Alberto! Me encuentro leyendo tus tutoriales!

    Un abrazo.

    ResponderEliminar