Buenas, hace un tiempo que quería implementar multitarea en un MSX1 y este año me puse a ver como podía hacerlo. Después de darle muchas vueltas al asunto y de hacer muchas pruebas, terminé haciendo una librería en C de threads con partes mínimas en ensamblador. No sabía nada de ensamblador de Z80 ni de arquitectura de MSX (no es que ahora sepa mucho más...
) así que tuve que ponerme aprender un poco. Debería andar en la mayoría de las MSX con al menos 64k de RAM, aunque es probable que haya que adaptarla para que funcione en máquinas que hacen uso de slots expandidos...
Tanto la librería como las aplicaciones se pueden compilar en Windows o en Linux. Para Windows hay que modificar un poquito los Makefile, y utilizar binarios de Windows para el proceso de compilación, cualquier cosa me dicen y explico un poco mejor el asunto.
De paso les comento que con SDCC se puede generar binarios para MSX-DOS, para ROMS y para ser cargado con BLOAD. Si bien SDCC genera código para Z80, no tiene implementado nada de MSX, por lo que hay que hacer una implementación de las primitivas que vayan a usarse y del fichero crt0 encargado de inicializar el programa.
En la página de Avelino Herrera Morales:
LINK, hay una implementación de las primitivas para MSX-DOS y también hay un enlace a otra pagina que explica como generar ROMS.
Como yo tuve un problema con el tema de la multitarea en MSX-DOS, opté por el formato para BLOAD.
Para compilar en este formato con SDCC no encontré absolutamente nada en internet, así que tuve que hacer un crt0 (basado en el de Avelino), un programita que le ponga la cabecera al ejecutable e implementar las primitivas para que use las llamadas a la BIOS (solo las que fui usando)
Todo esto lo pueden descargar desde acá:
LINKPara ver como se utiliza pueden ver el programa de ejemplo mt.c, después hice un programa más complejo que vendría a ser una especie de shell con programas hardcodeados que permite ejecutarlos en primer plano o en segundo plano (background)
Como sabrán con el tema de la multitarea surgen los llamados problemas de competencia, por lo cual también hice una implementación de semáforos, que también sirven para sincronizar threads.
Una prueba muy interesante es deshabilitar el uso de semáforos en el programa mt.c y ver como se pierden conteos en la suma total.
Por ultimo, la librería puede adaptarse a otras plataformas, incluso a otras arquitecturas como la de los PICS, solo hay que portar las partes en ensamblador e implementar las primitivas para cada máquina.
Bueno, les dejo una imagen DSK para que carguen en una maquina real o en un emulador el shell que hice. Tipeando help se muestran los comandos y programas disponibles.
Espero que les guste!
]shell.dsk[/file]