3.4 La ROM Basic3.4.1 L'arithmétique à virgule flottante Toutes les fonctions arithmétiques qu'utilise l'interpréteur Basic se trouvent dans la ROM du système d'exploitation. Elles sont appelées à travers une table de saut placée en &BD5E à &BDBB. Si vous voulez modifier les routines arithmétiques, il vous suffit d'insérer à l'emplacement voulu un saut à votre routine. Nous allons vous montrer comme exemple d'application des routines avec virgule flottante une routine de calcul de la racine carrée d'un nombre. L'interpréteur Basic du CPC nous fournit certes déjà cette fonction mais nous voulons démontrer que celle-ci peut être encore améliorée par l'emploi d'algorithmes plus puissants. La fonction SQR intégrée travaille d'après le même algorithme que le calcul de la puissance. SQR(X)=EXP( LOC(X)*0.5 ) Il faut donc calculer chaque fois les fonctions exponentielle et logarithme, ce qui s'effectue à travers des calculs de polynômes compliqués et longs. La racine carrée peut cependant être calculée simplement à travers un processus d'itération.X(N+1 )=(X(N)+A/X(N))/2 où A est le nombre dont la racine doit être extraite, X(N) est l'ancienne et X(N+1 ) la nouvelle valeur approchée. Comme valeur de départ, on peut prendre le nombre A lui-même. On obtient une meilleure valeur approchée lorsqu'on divise par deux la puissance de deux du nombre à virgule flottante. Le résultat ne se modifie plus ensuite, après 4 itérations, dans le cadre de la précision de calcul. Notez également que la division par deux n'a pas été réalisée avec une division à virgule flottante qui prend beaucoup de temps. On a simplement décrémenté de 1 la puissance de deux. Le gain de temps dû à ce procédé est significatif.La routine SQR de l'interpréteur met en effet 27 millisecondes, alors que notre routine exécute la même tâche en 8 millisecondes. Elle est donc plus de trois fois plus rapide. ;ROUTINE SQR RAPIDE ;L.E. 10/6/85 A000 ORG &A000 BD91 SGN EQU &BD91 BD85 DIV EQU &BD85 BD79 ADD EQU &BD79 A000 CD70BD NEWSQR CALL SGN ; examiner signe A003 3F CCP A004 C8 RET Z ; zéro, déjà terminé A005 F20CA0 JP P,GOON A008 3E01 LD A,1 ;'IMPROPER ARGUMENT' A00A B7 OR A A00B C9 RET A00C E5 GOON PUSH HL A00D 1153A0 LD DE,STORE1 A010 010500 LD BC,5 A013 EDB0 LDIR ;ranger radicande A015 E1 POP HL A016 ES PUSH HL A017 DDEl POP IX A019 DD7E04 LD A,(IX+4) ;puissance A01C D681 SUB &81 ;normaliser A01E 3F CCF A01F 1F RRA ;diviser puissance par deux A020 C601 ADD A,1 A022 DD7704 LD (IX+ 4),A ;comme valeur départ A025 0604 LD B,4 ;4 itérations A027 C5 ITER PUSH BC A028 E5 PUSH HL A029 1158AO LD DE,STORE2 A02C 010500 LD BC,6 A02F EDB0 LDIR ;ranger valeur approchée A031 El POP HL A032 E5 PUSH HL A033 1153A0 LD DE,STORE1 A036 EB EX DE,HL A037 010500 LD BC,5 A03A EDB0 LDIR ;aller chercher radicande A03C E1 POP HL A03D 1158A0 LD DE.STORE2 A040 CD64BD CALL DIV A043 1158A0 LD DE.STORE2 A046 CD58BD CALL ADD A049 E5 PUSH HL A04A DDEl POP BC A04C DD3504 DEC (IX+4) ;nombre/2 A04F C1 POP BC A050 10D5 DJNZ ITER A052 C9 RET A053 STORE1 DEFS 5 A058 STORE2 DEFS 5Mais comment faire pour que l'interpréteur utilise la nouvelle routine? C'est le vecteur &BD9D qui sert pour la fonction SQR. Il faut donc placer en cet endroit un saut à notre routine:JP &A000Lorsque la routine est appelée en Basic, le registre HL doit être pointé sur la valeur à virgule flottante. Après exécution de la routine, le registre HL doit être pointé sur le résultat. Normalement la valeur de registre ne doit pas avoir été modifiée. Les flags indiquent l'état des erreurs de la fonction: Etat des erreurs de la fonction:C=1 'exécution correcte C=0 & Z=1 'Division by zéro' C=0 & N=1 'Overflow' C=0 & Z=0 'Improper argument'
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 262 millisecondes et consultée 2022 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|