Le 09/12/2021, Edgar a écrit :
> > Je me suis remis à la programmation assembleur Z80 en faisant un
> > reboot du jeu d'aventures que j'avais développé (et commercialisé) au
> > début des années 90, sur Amstrad CPC.
>
> Tiens ! Je serais curieux de voir ça. ;-)
Cf :
https://cpcrulez.fr/GamesTest/fugitif.htm
Y'a eu plusieurs reviews dans divers magazines de l'époque (là, tu as
Amstrad 100% et Tilt. Avec des avis très divergeant sur la gestion du
jeu !).
Tu trouveras en bas de cette page les dumps DSK pour émulateurs...
> Je ne suis pas spécialiste, mais je me souviens avoir lu un article en
> anglais sur les « protothreads », qui sont des sortes de coroutines
> légères, qui n'impliquent pas des changements de contexte. Ça présentait
> une implémentation en C basée uniquement sur le préprocesseur. L'idée
> est d'écrire un code qui a l'air purement séquentiel, avec des appels à
> YIELD(), et laisser le préprocesseur transformer ça en une machine à
> états. La variable d'état correspond à la ligne où il faut reprendre
> l'exécution au prochain appel. Chaque YIELD() met à jour cette variable
> et fait un simple return.
Approche intéressante...
> Là, pour le coup, si tu réécris ça en machine à états à la main, je n'ai
> pas l'impression que ça ajoute beaucoup de complexité. Ça revient à
> transformer ça :
>
> void print(const char *message)
> {
> while (*message) draw_character(*message++);
> }
>
> en ça :
>
> /* Call with NULL to print the second and subsequent chars. */
> void print(const char *message)
> {
> static const char *p; // state variable
> if (message) p = message; // start a new message
> if (*p) draw_character(*p++);
> }
Oui, effectivement, pour cette fonction, c'est assez simple. Mais j'ai
d'autres routines qui auront besoin d'être splittée, comme le cls de la
console, ou le scroll de cette même console. Là, ce ne sera pas un simple
pointeur à balader. C'est pour ça que je voulais implémenter les
coroutines, histoire d'avoir un outil unique pour tout gérer. Et puis
c'est un bon exercice ;o)
--
Frédéric