Introducción a Z88DK (II)

No, en esta ocasión no va mos a hablar de qué contiene cada directorio de la instalación de z88dk, o cuál es la función de cada uno de los ejecutables. Vamos a intentar enumerar qué es lo que nos proporciona z88dk a nivel de código, es decir, a nivel de librería. Esto es necesario porque la documentación es bastante pobre en lo que respecta a la descripción de las funciones que podemos utilizar, o de los archivos .h y su contenido. De hecho, este punto no se explica en absoluto, por lo que en un primer momento somos incapaces de determinar las posibilidades que se nos ofrecen.

Sin duda alguna, el lugar donde más información encontraremos sobre las funciones disponibles es en los archivos de cabecera (archivos .h). Ya se comentó en la anterior entrega que no era la intención de esta serie de artículos el explicar los entresijos del lenguaje C, pues hay en la red tutoriales muy buenos sobre el tema, y además no acabaríamos nunca. Baste con decir que los archivos de cabecera nos proporcionan los prototipos de las funciones (nombre y parámetros) y la definición de las variables que la librería pone a nuestra disposición. Deberemos incluir en nuestro código los archivos de cabecera que contengan las funciones que queramos utilizar para que durante el proceso de compilación se enlace con la parte de la librería adecuada.

Sin más preámbulo procedamos a realizar una pequeña descripción de los principales archivos de cabecera incluidos con z88dk, siempre y cuando el contenido sea importante en la programación de aplicaciones para Spectrum. Estos ficheros se encuentran en el directorio include, donde podemos localizar, además de algunos .h, unos pocos directorios… pero, ¿qué podemos encontrar entre tanta hache?

Como vimos en el capítulo anterior que z88dk permitía programar para diversas máquinas; así pues, nos centramos en funcionalidades que a primera vista podrán ser utilizadas en el Spectrum. Esto hace que descartemos todos los archivos incluidos dentro de los directorios de la carpeta include. Y de esta carpeta, solo explicaremos algunos de los archivos.h incluidos.

Así pues, comencemos con archivos de cabecera que proporcionan funciones más o menos estándar, que podríamos encontrar en la mayoría de los compiladores de C:

  • stdio.h: tiene el mismo nombre que la librería estándar de entrada y salida de C, y de hecho cumple con el mismo cometido. Incluye, como en el caso de la librería de C, funciones para escribir en pantalla y leer de teclado, tanto variables de todo tipo como carácteres individuales. También hay funciones para… ¡lectura y escritura de ficheros!. Ya veremos en el futuro para qué sirve todo esto, o si es posible utilizarlo para generar código para el Spectrum. Por último podemos encontrar unas funciones que no son estándar, pero que son muy útiles para juegos: una función que devuelve la tecla que se está pulsando en ese momento, otra que no termina hasta que no se pulsa una tecla, etc.
  • stdlib.h: equivalente a la librería estándar de C. Contiene funciones para generar números aleatorios, detener el programa durante un tiempo determinado, o convertir enteros a flotantes y viceversa.
  • float.h: rutinas para el manejo de número en punto flotante, como valor absoluto, redondeo hacia abajo y hacia arriba (floor y ceiling), etc. También se definen una serie de constantes empleadas por math.h.
  • iso646.h: contiene definición de constantes asignando nombres a las operaciones booleanas como &&, ||, &=, etc.
  • malloc.h: funciones para el manejo de memoria (reserva y liberación, etc).
  • math.h: funciones matemáticas, como senos, cosenos, logaritmos, potencias…
  • limits.h: contiene constantes que definen el valor máximo y mínimo para los tipos de datos como el entero, el carácter (recordemos que en C los caracteres son equivalentes a los enteros), etc.
  • string.h: equivalente al string.h del lenguaje C estándar. Contiene métodos para crear cadenas, concatenarlas, estimar su longitud, compararlas, obtener posiciones de caracteres dentro de cadenas, obtener tokens, etc. Es curioso resaltar que también se incluye el archivo strings.h, el cual tan solo contiene un #include . El autor del presente texto supone que la causa será mantener la compatibilidad con programas realizados con versiones anteriores de la librería.

Uno de los sencillos ejemplos que acompañan a z88dk. El texto en acción.

  • ctype.h: funciones para el manejo de carácteres. Permiten comprobar si un carácter es un ASCII, es un carácter de control, es numérico, es alfanumérico, es imprimible, está en mayúsculas o minúsculas, etc. También se permite pasar un carácter a mayúsculas o minúsculas.

El cómo podremos utilizar estas funciones más o menos estándar en nuestros programas de Spectrum es algo que iremos desvelando en capítulos sucesivos. Ahora nos fijamos en los archivos de cabecera más interesantes a priori, los que permiten programación específica de gráficos, sonidos, sprites, cintas, etc.

  • spectrum.h: funciones propias para el Spectrum. Tenemos en este fichero un tipo estructura que define una cabecera de una cinta, y funciones de manejo de cinta, para salvar o cargar bloques.
  • graphics.h: rutinas gráficas básicas; dibujo de líneas, círculos, cajas, puntos, rellenar figuras, borrar puntos, borrado de la pantalla (o un área de la misma). Se permite tambien el empleo de XOR con puntos. El XOR es una operación lógica que devuelve 1 si los dos operandos son distintos. Se suele utilizar en gráficos para realizar mascaras, o para dibujar y borrar sprites. Al final del fichero hay unas funciones no utilizables por el Spectrum, como por ejemplo una para crear ventanas. Como se puede observar, la mayoría de las rutinas gráficas de graphics.h se refieren al dibujo de primitivas, lo cual se puede realizar sin ningún problema en BASIC, por lo que en un principio parece bastante limitado.

Desde sencillas rutinas gráficas que podríamos crear con el BASIC gracias a graphics.h...

  • sound.h: rutinas para sonido de 1 bit, es decir, nada de polifonías. Esto, una vez más (como en el caso de graphics.h) es bastante limitado. Se puede producir un sonido durante un tiempo determinado, ya sea indicando periodo o frecuencia. También se pueden hacer sonar notas sucesivas mediante una función que acepta como parámetro una cadena, que represente la melodía.
  • games.h: funciones interesantes, si lo que deseamos con z88dk es crear juegos. Contiene funciones para el manejo de sprites (obtener un sprite de la pantalla - función no terminada, dibujar un sprite de tamaño variable en la pantalla, funciones para joysticks, y definición de constantes referidas a operaciones lógicas con los sprites). Las variables que representan a los sprites se almacenan como punteros a void, es decir, como punteros a una dirección de memoria en los que no se especifica el formato. Ya veremos cual es dicho formato en próximos artículos. Lo que queda claro es que quizás el apoyo para la realización de juegos es algo pobre. No hay nada referente a scroll, no hay nada referente a colisiones, etc.

... hasta cosas más complicadas, e incluso sprites, gracias a games.h.

  • rs232.h: para el manejo del interfaz serie. El spectrum dispone de uno de estos. Aplicaciones de esto las podemos encontrar en internet, como la conexión mediante RS232 entre un Sinclair QL y un Spectrum o el terminal Spectrum que en su día intento llevar a cabo Santiago Romero.
  • debug.h: contiene dos prototipos de funciones de depuración. Una permite el desensamblado de una línea de código, y la otra permite examinar el contenido de n posiciones de la pila a partir de una dirección dada.
  • assert.h: contiene otra función de depuración. Esta función admite un parámetro, en forma de expresión. Si la expresión no evalúa a cero no ocurre nada y el programa sigue ejecutándose. En caso contrario, el programa se detiene, indicándose la línea y el fichero donde se ha producido dicha detención.
  • time.h: funciones de tiempo, aunque lo que nos interesa en este archivo es la definición de una constante que nos indica los ciclos por segundo de las distintas máquinas, como el Spectrum o el ZX81, por ejemplo.

Esto es, por lo tanto, y a grandes rasgos, lo que se nos ofrece. Será el cometido del presente tutorial el, a lo largo de las sucesivas entregas, permitirnos saber si todas estas funcionalidades serán suficientes para realizar programas o juegos para nuestro Spectrum de forma asequible, entendiendo por asequible mayor facilidad al usar el lenguaje C que el lenguaje ensamblador. Es decir, se va a tener que programar de todas formas, pero siempre es mejor hacerlo en un lenguaje de alto nivel.