Mediante esta página pretendo dar a conocer algunos de mis proyectos de programación con el MSX
El compilador SDCC es un compilador cruzado para pequeños dispositivos, que se ejecuta tanto en Windows como en Unix/Linux y que permite generar código para una gran variedad de plataformas de 8 y 16 bits. Entre las plataformas que soporta se encuentra el Z80 y el Z80 con las extensiones de GameBoy (GBZ80).
El código Z80 que genera este compilador por defecto no está destinado para ser ejecutado en un MSX y la salida que genera es un fichero en formato IntelHex. Mediante el uso de este backend para MSXDOS conseguiremos que los ficheros de salida sean fácilmente convertibles a .COM. Los requisitos del sistema Windows o Unix/Linux donde vayamos a realizar la compilación son:
Ambas herramientas pueden ser instaladas tanto en forma binaria como partiendo de los fuentes y compilándolas. Los ficheros básicos para genererar código compatible MSXDOS mediante el SDCC son los siguientes:
main y que añade un overhead de 112 bytesfiles.sinterrupt.sin y out para facilitar la compatibilidad con código Hitechin y outEl código de startup es imprescindible, pues permite que los programas compilados con SDCC se ejecuten en MSXDOS. putchar.s y getchar.s sólo es necesario incluirlos si vamos a utilizar funciones de la librería stdio.h para entrada/salida por consola tales como printf o gets. files.s contiene las funciones open, close, read, write, etc para el acceso a ficheros mediante handles (MSXDOS2), mientras que interrupt.s contiene las funciones install_isr y uninstall_isr para la manipulación de interrupciones. El fichero de cabecera ioport.h permite acceder a los puertos de la forma estándar out(dirección, dato) y in(dirección) en lugar de hacerlo mediante la extensión "sfr at" del compilador SDCC.
Lo primero que debemos hacer es ensamblar los ficheros .s anteriores mediante el ensamblador as-z80 incluido en el SDCC:
$ sdasz80 -o crt0msx_msxdos.s ó $ sdasz80 -o crt0msx_msxdos_advanced.s$ sdasz80 -o putchar.s$ sdasz80 -o getchar.s$ sdasz80 -o files.s$ sdasz80 -o interrupt.s$ sdasz80 -o ioport.sDespués de esta operación obtendremos 6 ficheros objeto con extensión .o y con el mismo nombre que los originales. Para hacer una pequeña prueba partimos de un fichero fuente de ejemplo ejfile.c y de otro fichero data2.txt que será leido por nuestro programa:
#include <stdio.h>
#include <stdlib.h>
#include "files.h"
#define TO_READ 50
char data[TO_READ + 1];
char fd;
unsigned int size;
void main(void) {
fd = open("DATA2.TXT", O_RDONLY);
if (fd < 0) {
printf("Could not open DATA2.TXT\n");
return;
}
size = read(fd, data, TO_READ);
printf("Attempting to read %d bytes. %d readed.\n\r", TO_READ, size);
data[size] = 0;
printf("Buffer = '%s'\n", data);
close(fd);
return;
}
Compilamos de la siguiente manera:
$ sdcc -mz80 --code-loc XXX --data-loc YYY --no-std-crt0 ./crt0msx_msxdos.o ./putchar.o ./getchar.o ./files.o ejfile.c
Nótese el parámetro --no-std-crt0 que le indica al compilador que no utilice el código de inicialización (startup) que trae por defecto para el Z80, sino que nosotros suministramos el nuestro por línea de comandos. --code-loc XXX sirve para indicarle al compilador dónde queremos que comienze el código: Si utilizamos crt0msx_msxdos.s XXX = 0x106 mientras que si utilizamos crt0msx_msxdos_advanced.s XXX = 0x170. YYY le indica al compilador la localización de las variables globales, si hacemos YYY = 0 ponemos las variables globales inmediatamente después del código.
Si no hay errores de compilación, entre los ficheros resultantes habrá uno llamado ejfile.ihx, el cual pasaremos por parámetros a la utilidad hex2bin para que lo convierta a binario:
$ hex2bin ejfile.ihx
Después de esta sentencia tendremos en el directorio actual un fichero ejfile.bin que podremos renombrar sin problemas a ejfile.com y ejecutarlo en el MSXDOS2.
$ mv ejfile.bin ejfile.com
El programa ejint.c se muestra como ejemplo de código para manejar las interrupciones utilizando interrupt.o e interrupt.h. En este caso, para compilar debemos añadir el fichero interrupt.o a la línea de comandos del SDCC
$ sdcc -mz80 --no-std-crt0 ./crt0msx_msxdos.o ./putchar.o ./getchar.o ./interrupt.o ejint.c
Como se puede comprobar hemos quitado el fichero files.o al no ser necesario en este caso para el linker.
main (crt0msx_msxdos_advanced.s).main.files.s y files.h ya que la función lseek no tenía los parámetros en el orden lógico. Ahora ya cumple con la recomendación POSIX.out(dirección, dato) y in(dirección)read y write de files.h de "unsigned int" a "int" para poder detectar valores negativosmain y arreglado el bug que afectaba a la inicialización de variables globalesmalloc, realloc, free, etcEn esta sección iré publicando código fuente C para MSX relacionado con la programación de la Moonsound. Los códigos publicados están relacionados con la serie de dos artículos que he escrito para la revista Call MSX, en concreto para sus números 3 y 4 sobre la programación de la Moonsound.
sbiload:En esta sección iré publicando código fuente y datos relacionados con la implementación del algoritmo de compresión/descompresión Huffman en el MSX.
huffman.tar.gz contiene una implementación ANSI-C de los algoritmos de compresión y descompresión Huffman así como una versión específica para MSX del algoritmo de descompresión. La versión específica para MSX requiere, para ser compilada:
Ver fichero README en la subcarpeta huffman/msx.
En esta sección iré publicando código fuente, utilidades y datos relacionados con la programación del VDP.
á é í ó ú ü Á É Í Ó Ú Ü ñ Ñ ¡ ¿ así como algún que otro símbolo. Aquí está:
screen 2 (1 bit por pixel, blanco = 1, negro = 0). Este es el resultado de aplicar este programa a la tabla de caracteres Latin1 anterior.En esta sección iré publicando código fuente, utilidades y datos relacionados con la programación del PSG.
psg_sample anterior. Utiliza la tabla de conversión logarítmica indicada en http://map.tni.nl/articles/psg_sample.php.Sección dedicada al uso de aritmética de punto fijo en en Z80 y/o en el MSX en particular.

This work is licensed under a Creative Commons License.
Página mantenida por Avelino Herrera Morales