vendredi 7 septembre 2012

68060.library (Apollo) (I)

En regardant de plus près la 68060.library des cartes Apollo, j'ai trouvé un bug qui a tout l'air d'être une étourderie de la part du codeur : un jsr au lieu d'un jmp ! Ce genre de bourde arrive de temps en temps, le programmeur pense jmp et tape à la va-vite jsr...

Rappel pour ceux qui ne sont pas forcement au courant des entrailles du système de l'Amiga : Motorola avait commercialisé un FPU avec le 68020, qui est une unité de calcul utilisant les nombres à virgules comme par exemple 1,5987155. En effet, le 68020 lui-même ne comprends que les nombres entiers comme 99 ou alors 1247...

Ce FPU (appelé aussi 68881 et ensuite pour une nouvelle version plus rapide 68882) est donc un composant externe au 020. Or, certainement pour réduire les coûts de fabrications et de productions, Motorola a décidé de l'intégré dans ses processeurs suivants, les 68040 et 68060. Nous faisons tous des erreurs, et là Motorola en a fait une très belle en supprimant purement et simplement toutes les fonctions trigonométriques alors qu'elles étaient bien présentes dans le 68882... Arg, si certains logarithmes ou exponentielles sont peu utilisés, les deux majeures que sont les sinus et le cosinus ne devaient surtout pas être ôtés de la sorte car elles sont souvent appelées par les programmes 3D... Regardez là par exemple dans Quake 2 :

Enfin bref, pour garder la compatibilité avec les programmes écrits pour 68020/030 et sa FPU, il a donc fallut pondre des routines de remplacement software qui émulent ces fonctions trigos maintenant manquantes dans le 68040 et le 68060. C'est ce que contient la 68040.library et la 68060.library qui se chargent par le SetPatch au démarrage de nos Amiga Classics adorés.

Or le soucis, c'est que ces fonctions software sont bien moins rapides que des fonctions hardware faites de transistors au sein même des CPUs... Désolé, mais pas bien Motorola sur ce coup là !

Pour en revenir au bug trouvé, le voici :

La routine ex_super_Fpu va être exécutée une seconde fois et plus par la R_Supervisor. La solution, c'est de remplacer le jsr par un jmp et tout va bien alors !

Cette portion de code fait partie d'une fonction de l'exec.library, la R_Switch qui devait être patchée par la 68060.library. J'en ai profité pour l'améliorer avec 70 octets de sauvés en utilisant du code de qualité ! Ca représente tout ça de gagné quand même :

La nouvelle librairie patche donc R_Switch maintenant sans le bug :

La version passe à 66.7 et fonctionne parfaitement avec RemApollo qui permet de reloger le Kickstart en fastram pour un léger speedup. Notez que la version 1.8 disponible il y a peu supporte maintenant très bien les Kickstart 3.9 pesant 1 Mo.

Pour en arriver à ce résultat, il a fallut désassembler toute la 68060.library pour recréer un source lisible, ce qui a demandé environ 16 jours de boulot acharné... Le nouveau Blog a donc un peu de retard !

La nouvelle version 66.7 est disponible en téléchargement ici.
  

1 commentaire:

  1. J'ai un 030+882 à 60 Mhz et je vais remettre un quartz 60 sur mon Apollo 1260 pour faire un comparatif de vitesse entre deux trigos hardware et deux trigos software...

    RépondreSupprimer

Posté vos remarques :