--== DEVLYNX ==--

 
 
|
 
 
 
 
Accueil
News
Doc
Mémoire
Recrutement
Faq
Liens
Pseudo :

Mot de passe :


Pas de compte ?

S'inscrire...


Statistiques :

Documentation


Rootretour à l'arborescence des catégories » Documentation techniqueEnsemble des informations pouvant être utiles au développement » Lynx docRestranscription de la documentation d'origine » Autres fonctionnalités matérielles » Multiptlications, Sommes et divisions matérielle
«««« ( /^\ ) »»»»
INFOS SUR LA CATEGORIE

Créée le : 2009-09-20 17:00:00
Par : vince





INFOS SUR LA PAGE

Titre : Multiptlications, Sommes et divisions matérielle
Sous Titre :
Langue : FRA
Source : http://www.monlynx.de/lynx/lynx9.html#_01
Auteur : vince
Posté par : vince

Multiptlications, Sommes et divisions matérielle

Nous disposons d'un multiplieur signé et non signé de 16 par 16 vers 32 avec accumulateur et d'un diviseur non signé 32 par 16 vers 32. Les resultats d'une multiplication sont un produit sur 32 bits, un accumulateur 32 bits et un bit de dépassement pour l'accumulateur. Les résultats d'une division sont un dividende sur 32 bits, un reste sur 16 bits et un bit pour indiquer une division par 0. Le nombre dans le dividende dans le cas d'une division par 0 est "0xFFFFFFFF" (BigNum). L'accumulateur est sur 32 bits et cumule les résultats de multiplications.

La façons standard pour utiliser l'une de ces opérations mathématiques est de commencer par écrire les valeurs de départ dans les registres de Suzy (toutes les adresses concernées sont différentes) et ensuite vérifier que le calcul est fini avant d'en lire les résultats. Le fait d'écrire dans le dernier registre a pour effet immédiat de démarrer les processus mathématiques.

Les fonctions de "signe" et d'"accumulateur" sont optionnelles. La valeur de SPRINIT sont pour le moment laissées inchangées pour les opérations de multiplication et de division. Le schéma ci dessous présente les opérations disponibles.

Chaque lettre représente un octet à une adresse différente. Ces adresses sont identifiées dans la section Mémoire avec des noms de type MATHx. Chaque groupe représente le type d'opération mathématique possible.
      AB
x CD
========
EFGH et Accumulation dans JKLM



EFGH | NP
======
| ABCD
(JK)LM |


Quelques règles :
Ecrire dans B, D, F, H, K ou M forcera l'écriture d'un "0" dans A, C, E, G, J ou L respectivement. Ainsi, si vous n'avez que 8 bits à écrire, il n'y a alors nul besoin d'écrire dans l'octet de poids fort. (sauf pour les multiplications signées.)

Ecrire dans A va lancer le calcul d'une multiplication 16 bits.

Ecrire dans E va lancer le calcul d'une division 16 bits.

Les étapes requises pour effectuer certaines de ces fonctions sont :

LSB : Less Significant Byte = Octet de poids faible
MSB : Most Significant Byte = Octet de poids fort
(attention ces mêmes sigles sont aussi utilisés pour Bits de poids fort et faible)


¤ multiplication 16 x 16 :
- Ecrire LSB dans D, MSB dans C
- Ecrire LSB dans B, MSB dans A
- Vérifier MULTSTAT jusqu'à la fin de l'opération (ou attendez simplement 54 ticks)
- Lire le résultat (LSB=>MSB) dans H, G, F, E

¤ accumulation :
Pour initialiser l'accumulateur, écrivez un "0" dans K et M (ce qui mettra aussi un "0" dans J et L). L'écriture dans M va réinitialiser le bit de dépassement. Notez que vous pouvez initialiser l'accumulateur à n'importe quelle valeur en écrivant dans les 4 octets (J, K, L, M)

¤ Division 32 par 16 :
- Ecrire LSB dans P, MSB dans N
- Ecrire LSB => MSB dans H, G, F, E
- Vérifier DIVSTAT jusqu'à la fin de l'opération (ou attendez simplement 400 ticks maximum)
- Lire le dividende (LSB=>MSB) dans D, C, B, A
- Lire le reste dans (LSB=>MSB) dans M, L

Pour vous simplifier la vie le matériel mettra J et K à zéro de sorte que le logiciel puisse traiter le reste come une valeur 32 bits.

1) Multiplications signées.
Quand la multiplication signée est activée, le matériel va convertir le nombre fourni par le CPU en positif et sauvegarder le signe de la valeur originale. Le résultat positif est placé dans la même zone de Suzy que la valeur d'origine et par conséquent la valeur d'origine est perdue. A la fin de la multiplication, les signes des nombres originaux sont examinés et si besoin est, le résultat est converti en négatif.
La conversion qui est opérée sur la valeur fournie par le CPU est faite quand l'octet de poids fort est envoyé par le processeur. Par conséquent, quand on écrit dans l'octet de poids faible, la valeur de l'octet de poids fort et renseignée à zéro mais ça NE change PAS le signe à "positif". En fin de compte, quand vous utilisez une multiplication signée, vous DEVEZ resneigner les deux octets de chaque nombre.

2) Multiplication et divisions répétées.
Tant que les valeurs en entrée ne sont pas dérangées, les multiplications et divisions répétées sont effectuées facilement simplement en changeant les octets et plus particulièrement celui qui lance l'opération.

Il y a cependant certaines restrictions dans l'utilisation des fonctions mathématiques :
¤ Suzy ne doit pas être en train de gérer des sprites
¤ Les étapes de la procédure d'utilisation doivent être respectées à la lettre. Si ce n'est pas le cas, les résultats ne correspondront pas à l'opération souhaitée.
¤ Le matériel n'est pas réentrant. Ca signifie qu'une fois lancé, l'opération ne peut être interrompue.

Il y a une considération d'interruption. Bien que le matériel ne soit pas réentrant, quelques routines d'interruption pourront vouloir attendre que l'opération soit effectuée, sauvegarder le résultat, effectuer son comportement propre, obtenir son propre résultat et enfin restaurer les valeurs précédentes. Bien que ça puisse marcher pour des opértions simples, ça peut perturber les valeurs d'entrée qui peuvent être toujours requises par le logiciel d'origine s'il effectue des opérations répétitives. Si le code de l'interruption veut sauvegarder et restaurer les valeurs originales, il devra lancer une nouvelle opération quand il les écrira à nouveau sur le matériel. Les différentes conséquences que cela pourrait engendrer n'ont pas toutes été explorées donc soyez prudent.

3) Minutage des opérations mathématiques.
Les multiplications non signées sans accumulation prennent 44 ticks pour se finir.
Les multiplications signées et avec accumulation prennent 54 ticks pour se finir.
Les divisions prennent 176 + 14 x N ticks où N est le numéro du zéro le plus élevé dans le diviseur.

4) Bogues dans la zone matheuse.
NOTE IMPORTANTE : Il y a certains dysfonctionnement dans le matériel pour les multiplications et divisions. Force est de constater qu'on n'a pas eu la chance de les corriger.
¤ Dans les multiplication signées, le matériel pense que 0x8000 est un nombre positif.
¤ Dans les divisions, le reste peut avoir deux erreurs possibles, en fonction de sa valeur. Pas d'infos pour les expliquer ici, contentez vous de ne pas l'utiliser. Merci VTI.
¤ Dans les multiplications signées, le matériel pense que 0 est un nombre négatif. Ce n'est pas un problème immédiat quand on fait une multiplication par 0 vu que le résultat va être ré-inversé pour corriger le signe de 0. Cependant, vu que ça va affecter le bit de signe, on ne peut pas s'en contenter pour rester correct si on veut juste charger l'octet de poids faible après une multiplication par 0.
¤ Le bit de dépassement n'est pas toujours conservé dans le matériel. Vous devez le lire avant de faire quoi que ce soit à Suzy qui pourrait l'affecter. Typiquement, lisez le avant d'accéder au SCB.

(Source : http://www.monlynx.de/lynx/lynx9.html#_01)
«««« ( /^\ ) »»»»

générée en 29 ms
-= DevLynx, un site par vince pour vous =-