Site web d'HpFool

Le programme s2mfont

Présentation :
Ce programme transforme une chaine de caractères en GROB en utilisant la minifonte de la HP49G, et en tennant compte des retours à la ligne. Il fait donc exactement la même chose que 1 ->GROB mais en plus rapide (parfois 2 fois plus rapide). Toutefois dans sa version actuelle il ne marche qu'avec des chaînes de caractère situées en RAM.

Histoire :
J'ai fait ce programme à l'occasion du concours de programmation de la HpParty du 10 et 11 novembre 2001 à l'EPITA. Il était bien sûr le meilleur ;-) Je ne suis arrivé que second parce qu'il y avait deux programmes à faire et je n'avais fait que celui-là, mais c'est pas grave parce que je voulais justement arriver second pour gagner la HP40G ;-)

Principe de fonctionnement :
Le programme fonctionne en trois étapes :

  • Calcul de la dimmension du GROB : il s'agit ici de compter le nombre de retours à la ligne et la taille de la plus grande ligne afin de connaître les dimensions du GROB.

  • Création du GROB

  • Ecriture de la chaîne dans le GROB à l'aide de la minifonte : cette étape est la plus longue et la plus délicate, mais elle peut être réutilisée dans d'autres programmes (par exemple un éditeur de texte). Il s'agit ici d'une routine généraliste puisqu'elle peut utiliser n'importe quelle minifonte et écrire dans un GROB de n'importe quelle taille, aussi elle gagnerait beaucooup à être optimisée pour un GROB de taille connue.

Les optimisations :
Qu'est-ce qui rends ce programme plus rapide que les autres ?

Tout d'abord lors de la première étape, la taille du GROB est calculée en lisant la chaîne non pas caractère par caractère, mais par groupe de 8 caractères (16 quartets, ça tient dans un champ W). Le test pour savoir si un caractère est un retour chariot (# 0Ah) est alors fait en deux étapes, une par quartet du caractère, en utilisant le champ P.

Ensuite la phase d'écriture du GROB est très optimisée aussi : en minifonte, un caractère occupe 6 quartets (un quartet par ligne), plutôt que de lire le GROB du caractère quartet par quartet on commence donc par lire les 6 quartets du GROB ce qui fait une seule lecture au lieu de 6 (et les lectures sont très longues !), ensuite il suffit de faire des décalages vers la droite pour obtenir le quartet à écrire sur chaque ligne.
Mais ce n'est pas tout ! La grosse optimisation consiste à écrire les images de deux caractères consécutifs à la fois. Comme chaque caractère utilise un quartet par ligne, en écrivant deux caractères à la fois on peut utiliser un champ B à la place d'un champ P (et l'écriture avec un champ B est plus rapide que les autres !), tout en faisant deux fois moins d'écriture. Par contre ça bouffe des registres et ça devient un peu le bordel comme vous allez vous en rendre compte ;-) Pour simplifier, optimiser en vitesse et gagner un compteur que de toute façon on aurrait pas pu gérer faute de registre disponible, on déroule la boucle sur les 6 lignes des caractères.
Un des problèmes de cette étape est qu'il faut à la fois compter le nombre de caractères écrits (pour ne pas dépasser la fin de la chaîne) et tester si chaque caractère est un retour chariot... Donc pour accelerer on se contente de compter le nombre de lignes écrites, et l'on écrit un retour chariot suplémentaire en fin de chaîne (ce qui fait que le prog ne marche que sur des chaînes situées en RAM), afin d'éviter de compter les caractères écrits.

Enfin, il faut aussi mettre en blanc la fin des lignes (puisque le GROB n'est pas blanc lorsqu'il est créé). Là aussi c'est optimisé en utilisant des champs W pour faire moins d'écritures, mais il s'agit là d'une optimisation classique ;-)

Mais ce code est très probablement encore optimisable, vu que je l'ai fini vers 3 heures de l'après-midi après une nuit entière de codage, j'étais un peu trop fatigué pour fignoler ;-)

Voir les sources

email