CODINGLA BIBLE DU CPC 6128

La bible du CPC 6128 : 3.04.01 L'arithmétique à virgule flottante
3.4 La ROM Basic

3.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 5

Mais 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 &A000

Lorsque 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'

★ ANNÉE: ???

Page précédente : La bible du CPC 6128 : 3.03.03 Le pointeur de variable '@'
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 262 millisecondes et consultée 2022 fois

L'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.