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.