Les opérateurs à virgule flottante

Les registres sont plutôt limité tant par leur capacité que par leur format de nbres : il ne peuvent recevoir des nbres à virgule.
Heureusement pour nous il existe les opérateurs à ........ : les op.Il y en a six, ont chacun une taille de 11 octets. Ils peuvent prendre des valeurs allant de 9e-99 à 9e99. Seulement il sont un peu plus dure d'accès que les registres.

Premièrement comment les initialiser à une certaine valeur :

1) il faut utiliser la commande _opXsetY, X étant le numéro de l'op et Y la valeur. Attention cette technique est limité.
Voici les valeurs que vous pouvez assigner aux diff op :
op1 : 0, 1, 2, 3, 4 // op2 : 0, 1, 2, 5, 8, 60 // op3 : 0, 1, 2 // op4 : 0, 1 //op5 : 0 // op6 : impossible de cette manière

2) Vous pouvez utilisez trois autres commande moins limité : _setxxop1/_setxxop2/_setxxxxop2. Les deux premières commandes place la valeur du registre a dans l'op qui le suit, pour la troisième commande c'est hl dans op2.

3) Deux autres commandes : _rclX ou _rclY. Ces commandes rappellent la valeur de X ou Y (les mêmes variables qu'en basic) et les place dans _op1

4) Une méthode un peu plus compliqué mais sans limite sauf celle de la capacité des op

On sait qu'un op a une taille de 11 octets dont 2 sont utilisés pour les opérations mathématiques. le premier octet est utilisé pour le signe : 00 pour positif/ 80 pour négatif.

Ensuite, il faut procéder à une petite conversion du nombre en question. Transformez votre nombre en notation scientifique : mode sci.
Le deuxième octet est la valeur de l'exposant : 80 pour e0 // 81 pour e1.....// 7F pour e.-1 //7E pour e-2.........
Vous avez compris que l'on part de 80 pour e0 puis que l'on incrémente soit on décrémente mais en hexadécimal.

Il faut ensuite découper le nombre deux chiffres par deux. Attention, il faut mettre des $ devant chaque groupe de chiffres.

Exemple :

    7,5    7,5e0    $00,$80,$75,$00,$00,$00,$00,$00,$00
    121,4738    1,214738e2    $00,$80,$12,$14,$73,$80,$00,$00,$00
    -0,0012    -1,2e-3    $80,$7D,$12,$00,$00,$00,$00,$00,$00

Concrètement ça donne :

.......début standard.......
    ld hl,fp1
    ld de,op1
    ld bc,9
    ldir ; effectue l'initialisation de op1
    ret
fp1:
    .db $00,$80,$75,$00,$00,$00,$00,$00,$00
.end
END

ldir sera expliquer prochainement, un peu de patience.

Voici une liste des commandes mathématiques utilisés avec le op :

_ACOS : inv cos(op1)                            _INVSUB : op2 - op1
_ACOSH : inv cosh(op1)                             _LNX : ln(op1)
_ASIN : inv sin(op1)                             _LOGX : log(op1)
_ASINH : inv sinh(op1)                             _MAX : max(op1,op2)
_ATAN : inv tan(op1)                             _MIN : min(op1,op2)
_ATANH : inv tanh(op1)                             _MINUS1 : op1 - 1
_Ceiling : -intgr(-op1)                             _PLUS1 : op1 + 1
_COS : cos(op1)                             _PTOR : (op1,op2) pol>rect
_COSH : cosh(op1)                             _RANDOM : no input, generate rand #
_CUBE : op1^3                             _RNDGUARD : round(op1) to 10 digits
_DTOR : op1 -> rads                             _ROUND : round(op1) to D dec places
_ETOX : e^op1                             _RTOD : op1 -> degrees
_FACTORIAL : (op1)!                             _RTOP : (op1,op2) rect>pol
_FPADD : op1 + op2                             _SIN : sin(op1)
_FPDIV : op1 / op2                             _SINH : sinh(op1)
_FPMULT : op1 * op2                             _SQROOT : sqrt(op1)
_FPRECIP : 1/op1                             _TAN : tan(op1)
_FPSQUARE : op1 * op1                             _TANH : tanh(op1)
_FPSUB : op1 - op2                             _TENX : 10^op1
_FRAC : fpart(op1)                             _TIMES2 : op1 + op1
_INT : int(op1)                             _TIMESPT5 : op1 * .5
_INTGR : intgr(op1)                             _XROOTY : op1^(1/op2)
_TRUNC : ipart(op1)                             _YTOX : op1 ^ op2
 

Pas mal, Hein? Vous comprenez maintant pourquoi les op sont si importants.
 
Vous voulez encore d'autres commandes ........

_zerooop1 : 0 ds op1

_ cpop1op2 : compare op1 et op2. Met à jour le flag.

_convop1 : op1 dans le registre de.

_opXtoopY : opX dans opY. Seules les commandes _op3toop6 et _op6toop3 ne sont pas possibles.