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
|