Il était une fois, quand les ordinateurs étaient gros et les affaires ennuyeuses, quelque chose d'inattendu s'est produit. Les jeunes pirates ont trouvé un moyen d'assembler
des ordinateurs personnels sur des microprocesseurs bon marché à partir de télétypes et de feux de signalisation. L'un d'eux était Steve Wozniak. Ces gars-là ont pris les limites de leurs ordinateurs comme un défi, se sont assis et ont fait ces minuscules puces faire des choses incroyables. Voici ce que
le Journal du Dr Dobb a publié
en août 1976 :

Il s'agit d'un ensemble de procédures arithmétiques sur des nombres réels. Le microprocesseur (6502, le même que dans Apple I et II) ne pouvait fonctionner qu'avec des octets, c'est-à-dire des entiers compris entre 0 et 255. Pire, il ne pouvait que les ajouter et les soustraire. Mais avec cette bibliothèque, vous pouvez calculer

, ou même prendre la racine carrée de pi. Étonnamment, un auteur du programme nommé Steve Wozniak a adapté les fonctions principales (addition, soustraction, multiplication et division) en 239 octets, en utilisant un total de 127 instructions.
Il s'agit d'une programmation assez impressionnante. Après l'avoir lu plusieurs fois, je peux dire qu'il est tout simplement brillant. Par exemple, des cycles de procédures de multiplication et de division sont déclenchés 23 fois, une fois pour chaque bit du résultat. Pensez-vous que Woz passera deux octets à écrire la constante 23 aux deux endroits? Bien sûr que non! Il charge la constante 23 dans la routine préliminaire que les deux boucles utilisent:

Comme autre exemple, les algorithmes devraient prendre les valeurs absolues de M1 et M2. Pourriez-vous écrire
M1 = abs (M1);
M2 = abs (M2);
Woz ne répète pas comme ça. Il écrit
une procédure qui prend la valeur absolue de M1, puis modifie M1 et M2. Ensuite, il appelle cette procédure
deux fois , donc le même résultat est obtenu avec la moitié de la quantité de code. De plus, le remplacement de M1 et M2 est également nécessaire ailleurs, donc le code fait un double travail.
Bien sûr, une telle factorisation intensive rend difficile le suivi du flux, mais il est étonnant de voir à quel point ce code est en avance sur son temps. En lisant d'autres articles dans le numéro de 1976, vous pouvez trouver une tonne de code pas si bien écrit. C'est compréhensible: les gens ont juste compris comment tirer parti des nouveaux microprocesseurs. Et au milieu de tout ce diamant, qui pourrait bien être digne d'un hacker moderne de la demoscene. À titre de comparaison, voici le même niveau d'ingéniosité totale que dans cet
étonnant code 6502 30 ans plus tard.
Assez de l'histoire. Pourquoi ai-je étudié attentivement cet ancien code en 2019? Le fait est que je travaille sur un nouveau compagnon pour
I²CDriver et
SPIDriver , et il a dû effectuer des opérations en virgule flottante sur le processeur EFM8 8 bits de Silicon Labs (basé sur 8051), que j'ai utilisé dans des projets précédents. Maintenant, il effectue facilement ces calculs, tout comme la bibliothèque 6502. Je n'avais pas besoin d'un code aussi petit et optimisé, mais maintenant il fonctionne assez rapidement, un peu plus vite que la
bibliothèque Keil similaire . Un bon code ne meurt jamais!