BASES Fonction Introduction
Fonction Les bases de numération
Fonction Les nombres signés
Fonction Constitution d'une instruction
Fonction La mémoire de la TI-92
Fonction Les registres

Page précédente



 

Monter Descendre Retour Introduction
Retour But de cette page
Retour Le processeur des TI-92
Retour Fonctionnement des TI-92
Retour Données numériques
Retour Caractères




 

Monter Descendre Retour But de cette page
puce Cette page a pour but d'expliquer le plus clairement possible les bases de l'assembleur Motorola 68000, et aussi de vous donner deux trois informations utiles sur la TI-92.

puce Surtout ne perdez pas courage si vous pataugez, c'est presque normal étant donné que le language assembleur est radicalement différent des languages de haut niveau tels que le Turbo Pascal, le C/C++, le Basic...

puce N'oubliez pas que je suis toujours disponible pour répondre à vos question. Plusieurs d'entre vous m'ont déjà demandé de l'aide alors n'hésitez pas, sachez toutefois que je prépare un BTS et les réponses ne seront pas des plus rapides.

puce Vous devez avoir compris les parties abordées ici pour pouvoir commencer à programmer dans de bonnes conditions.





 

Monter Descendre Retour Le processeur des TI-92
puce Le processeur utilisé par les TI-92, TI-92II, TI-92+ et TI-89 est un Motorola 68000 cadencé à 10 Mhz, celui-ci est plutôt simple d'utilisation par rapport aux autre processeurs existant (x86, Pentium...).

puce Pour vous faire une idée de sa puissance, sachez qu'il peut rivaliser avec la console Megadrive de Sega, le Motorola 68000 est un processeur 16 bits avec des registres 32 bits.





 

Monter Descendre Retour Fonctionnement des TI-92
puce Tout système informatique ne comprend que deux états : 0 et 1.
Une valeur qui peut être égale et seulement égale à 0 ou 1 est appelée bit.

Ceci est équivalent pour nous à OUI et NON, VRAI et FAUX...

puce Il n'y a pas d'alternatives telles que "peut-être", "oui mais non"...
C'est entre autre pour cela que les nombres aléatoire n'ont d'aléatoire que le nom, car ils sont en fait générés par une fonction de période très longue.





 

Monter Descendre Retour Données numériques
puce Pour ne pas être limités, ces états appelés bit sont regroupés par paquets pour avoir de nouvelles possibilités :

8 bits forment un OctetByte en anglaisd'où .b dans un programme
schématiquementxxxxxxxxx représente un bit
nous avons 2^8 possibilitées=256 nombres différents
16 bits forment un MotWord en anglaisd'où .w dans un programme
schématiquementxxxxxxxxxxxxxxxxx représente un bit
nous avons 2^16 possibilitées=65536 nombres différents
32 bits forment un Double motLongword en anglaisd'où .l dans un programme
schématiquementxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx représente un bit
nous avons 2^32 possibilitées=4294967296 nombres différents

puce Un mot est donc composé de deux octets, et un double mot est composé de deux mots soit quatre octets.





 

Monter Descendre Retour Caractères
puce La TI-92 dispose de 256 caractères différents, donc à chaque variations d'un octet (8 bits) correspond un caractère.

puce Reportez vous à l'annexe B-6 du manuel de votre TI-92 pour avoir le code des différents caractères.





 

Monter Descendre Retour Bases de numération
Retour Plusieurs représentations ?
Retour Représentation décimale
Retour Représentation binaire
Retour Représentation hexadécimale




 

Monter Descendre Retour Plusieurs représentations ?
puce Un système de numération est une manière parmi tant d'autres de représenter une valeur.
Ceci avec des suites de digits, un digit peut prendre la valeur d'un symbole disponible (en décimal 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 et 0), qui sont d'un nombre inégal et de formes différents selon la base utilisée.

puce Pour mieux comprendre ce que je viens de vous dire, pensez que les romains (et les Italiens encore un peu de nos jours) utilisaient les symboles I, V, X... et les combinaient entre eux (d'une façon un peu spéciale toutefois).

puce Notre pays ainsi qu'une grande partie de la planète utilise le système décimal constitué de dix symboles, ceux-ci sont 1, 2, 3, 4, 5, 6, 7, 8, 9 et 0. Nous les combinons pour arriver au même résultat.

puce Les systèmes informatiques nous ont obligés à changer notre système maternel car ceux-ci ne comprennent que les états ouverts et fermés (physiquement sous forme de tensions dans des transistors). Les premiers informaticiens ont choisis comme symboles 0 et 1 pour le système binaire (base 2). Désormais il faudra combiner ces 0 et 1.

puce Le système binaire étant très lourd et fort peu compréhensible par l'homme, les informaticiens ont alors eu l'idée de créer le système hexadécimal (base 16), celui-ci est constitué de nos digits 1, 2, 3, 4, 5, 6, 7, 8, 9 et 0 mais aussi des digits A, B, C, D, E, F.
Le grand avantage de cette représentation, c'est qu'un digit hexadécimal est équivalent à 4 digits binaires.

puce Le code ASCII fait même office de système de numération (base 256) puisqu'à chaque caractère correspond une valeur !

puce Nous ne parlerons pas du système octal (base 8) car celui-ci n'est pas ou très peu utilisé aujourd'hui.





 

Monter Descendre Retour Représentation décimale (base 10)
puce C'est la base de numération que nous utilisons tout les jours, mais pour comprendre les bases binaires et hexadécimales, nous avons besoins de décortiquer un nombre simple, par exemple 1998 :
8=8*1
98=9*108*1
998=9*1009*108*1
1998=1*10009*1009*108*1

puce Le chiffre des unités est multiplié par 1, celui des dizaines par 10, celui des centaines par 100 puis celui des milliers par 1000, jusqu'ici rien de difficile.

puce Ces nombres 1, 10, 100 et 1000 sont des puissances de 10, dans l'ordre 10^0, 10^1, 10^2 et 10^3. Cette représentation est appelé base 10, permet de représenter tous les nombres possibles grâce à une combinaison de chiffres allant de 0 à 9.

puce En assembleur Motorola 68000, il faut mettre # avant toute valeur décimale.

EXEMPLE
MOVE.w #1998,D0 ; copie le nombre #1998 dans le premier mot de D0





 

Monter Descendre Retour Représentation binaire (base 2)
puce Cette fois ci, nous ne disposons plus que des symboles 0 et 1.
Un digit est appellé bit (BInary digit), ceci est un clin d'oeil au mot bit qui veut littéralement dire "petit".

puce Prenons quelques nombres simples et voici l'analyse que nous pouvons en faire :
00000001=0*1280*640*320*160*80*40*21*1=1
00000011=0*1280*640*320*160*80*41*21*1=3
00101011=0*1280*641*320*161*80*41*21*1=43
11101011=1*1281*641*320*161*80*41*21*1=235

puce De droite à gauche, nous multiplions successivement la valeur des bits par 1, 2, 4, 8, 16, 32, 64, et 128.

puce Ces nombres 1, 2, 4, 8, 16, 32, 64 et 128 sont des puissances de 2, dans l'ordre 2^0, 2^1, 2^2 et 2^3, 2^4, 2^5, 2^6 et 2^7. Cette représentation est appelé base 2 et permet de représenter tous les nombres possibles grâce à des groupements de 8, 16 ou 32 bits pour former respectivement un octet, mot et double mot.

puce Nous mettons à gauche des 0 qui paraissent inutiles parce que nous travaillons avec des octets, mots et doubles mots et nous devons représenter à chaque fois les 8, 16 ou 32 bits les composant.

puce Pour nommer un bit très rapidement nous leur attribuons un numéro qui s'appelle le rang, celui se trouvant le plus à droite a toujours pour rang 0, le bit immédiatement à gauche a comme rang 1 et ainsi de suite...
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3130292827262524232221201918171615141312111098765432101

puce En assembleur Motorola 68000, il faut mettre le signe % avant toute valeur binaire.

EXEMPLE
MOVE.w %1100101011000110,D0 ; copie le nombre %1100101011000110 dans D0





 

Monter Descendre Retour Représentation hexadécimale (base 16)
puce Cette représentation utilise toujours les 10 chiffres décimaux mais aussi les lettres A, B, C, D, E, F :
A=10
B=11
C=12
D=13
E=14
F=15

puce Cette représentation est appelée base 16 (car on a les 10 chiffres plus les 6 lettres) ou hexadécimale, elle permet donc l'obtention tous les chiffres possibles grâce à une combinaison de chiffres allant de 0 à 9 et de lettres allant de A à F.
8=8*1
98=9*168*1
A98=10*2569*168*1
EA98=14*409610*2569*168*1

puce Il est aisé de passer du binaire à l'hexadécimale, car quatre bits sont équivalent à un digit hexadécimal :
%1011001101011000 = % 1011 0011 0101 1000 = $ B 3 5 8 = $B358
car%1011 = $B
%0011 = $3
%0101 = $5
%1000 = $8

puce En assembleur Motorola 68000, il faut mettre le signe #$ avant toute valeur hexadécimale, pourquoi #$ et pas seulement $ ?

Et bien si vous écrivez MOVE.w $4000,D0 vous mettez dans le registre D0 le mot contenu à l'adresse effective $4000 de votre TI-92 et non la valeur $4000.
Donc si à l'adresse effective $4000 il y a la valeur $E534, D0 vaudra $E534 à la fin de l'instruction.
En faisant move.w #$4000,D0 vous mettez la valeur $4000 (= #16384 en décimal) dans D0.





 

Monter Descendre Retour Nombre signés
Retour Poids des bits, octets et mots
Retour Différence de signe
Retour Valeur signé ou non signé
Retour Opposé d'un nombre
Retour Programmation signée




 

Monter Descendre Retour Poids des bits, octets et mots
puce Nous pouvons utiliser un octet, un mot ou un double mot pour représenter un nombre, dans chaque cas nous auront une partie gauche dite de poids fort et une partie droite dite de poids faible.

puce Dans cette explication le rouge indique la partie de poids fort et le bleu celle de poids faible :
pour un octetxxxxxxxx
nous avons un bit de poids fort et un bit de poids faible
pour un motxxxxxxxxxxxxxxxx
nous avons un octet de poids fort et un octet de poids faible
pour un double motxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
nous avons un mot de poids fort et un mot de poids faible

puce La notion de bit de poids fort est prépondérante dans l'utilisation des nombres signés.





 

Monter Descendre Retour Différence de signe
puce Nous venons de parler du poids des bits, octets et mots. Ceci va nous permettre de comprendre aisément comment savoir si un nombre est signé (positif et négatif) ou pas.

puce Pour cela intéressons nous au bit de poids fort d'un octet, mot ou double mot. Car étant donné qu'en assembleur il n'y a pas de signes + et -, c'est ce bit qui joue ce rôle :s'il n'est pas armé (=0), le nombre est positif. S'il est armé (=1) alors le nombre est soit positif soit négatif.
00011010=26le bit de poids fort est desarmé
10011010=154=-102le bit de poids fort est armé
0011011100101110=14126le bit de poids fort est desarmé
1011011100101110=46894=-18642le bit de poids fort est armé
00011011110101001111010001010110=466941014le bit de poids fort est desarmé
10011011110101001111010001010110=2614424662=-1680542634le bit de poids fort est armé

puce Le bit de poids fort pour les nombres signés nous permet de savoir si le nombre est positif ou négatif.
Par conséquent sa valeur n'est plus 128 ou 0 mais "+ ou -" donc le champ des valeurs est modifié :
taillenombres non signésnombres signés
octet0à255-128à127
mot0à65535-32768à32767
double mot0à4294967295-2147483648à2147483647





 

Monter Descendre Retour Valeur signé ou non signé
puce La méthode pour passer d'un nombre non signé à un nombre signé a deux cas :
    pucesi le bit de poids fort est desarmé (=0) nous gardons la valeur du nombre qui sera considérée comme un nombre signé positif

    pucesi le bit de poids fort est armé (=1) il faut appliquer le complément à deux à la valeur non signée, le résultat sera consideré comme un nombre signé négatif.

EXEMPLE 1 :
Prenons le nombre non signé 123, #123 = %01111011
Le bit de poids fort est desarmé (%00111011) : on n'appliquera pas le complément à deux
Le résultat est la valeur du nombre non signé : %01111011 = #123

EXEMPLE 2 :
Prenons le nombre non signé 251, #251 = %11111011
Le bit de poids fort est armé (%10111011) : on appliquera le complément à deux
Complément à deux :
on fait un NON logique : NOT %11111011 = %00000100
puis on ajoute un : %00000100 + #1 = %00000101
Le résultat vaut : %00000101 = #-5





 

Monter Descendre Retour Opposé d'un nombre
puce On utilise la méthode de complément à deux pour trouver l'opposé (négatif) d'un nombre.

puce Il suffit de faire tout d'abord un NON logique sur le nombre que l'on veut opposer (les 0 deviennent 1 et inversement) puis de lui ajouter 1.

EXEMPLE
prenons le nombre 51, #51 = %00110011
on fait un NON logique, %00110011 -> %11001100
maintenant %11001100 + %00000001 = %11001101 = #-51

PROGRAMMATION
MOVE.w #116,D0 ; copie le nombre #116 dans D0
NOT D0 ; effectue un NON logique (complément à un)
ADD #1,D0 ; incrémente D0 pour avoir le complément à deux





 

Monter Descendre Retour Programmation signée
puce Dire qu'un nombre est signé ou non signé dans un programme est subjectif, tout ce passe au niveau des mnémoniques.

puce Parmi deux instructions similaires, une terminée par "U" servira à effectuer une action sur un nombre non signé (Unsigned), et une autre terminée par "S" effectuera la même action en considérant que le nombre est signé (Signed).

PROGRAMMATION avec MULS
MOVE.l #116,D0 ; copie le nombre #116=#-140 dans D0
MOVE.l #219,D0 ; copie le nombre #219=#-37 dans D1
MULS D0,D1 ; D0*D1 => D1 = -140*-37=#5180

PROGRAMMATION avec MULU
MOVE.l #116,D0 ; copie le nombre #116 dans D0
MOVE.l #219,D0 ; copie le nombre #219 dans D1
MULU D0,D1 ; D0*D1 => D1 = 116*219=25404

puce Notez que les instruction DIVS et DIVU effectuent aussi des actions sur des nombres considérés non signés ou signés...





 

Monter Descendre Retour Constitution d'une instruction
puce Dans un programme source, nous rencontrons des lignes de code du type :
MOVE.l D0,D1 ; copie le contenu de D0 dans D1
cette ligne de code appelée instruction peut être divisée en plusieurs parties.

puce Tout d'abord MOVE, c'est un des nombreux mnémonique que nous utilisons dans nos programmes, comme vous pouvez le constater c'est soit un mot anglais complet soit l'abréviation de plusieurs mots anglais...

puce Ensuite .l, c'est la taille des données du premier opérande qui fait office de source, vous avez au choix .b pour byte (octet / 8 bits), .w pour word (mot / 16 bits) ou .l pour longword (double mot / 32 bits).

puce Puis nous avons un premier opérande appelé opérande source, la plupart des instructions sont formées de deux opérandes, certaines un seul et d'autre aucun. Pour la majorité des instruction c'est lui qui influencera l'opérande de destination. Dans une soustraction par exemple, c'est la source qui est retranchée à la destination et qui reste inchangée.

puce La plupart du temps nous avons l'opérande de destination déjà citée, pour la majorité des instructions c'est lui qui sera influencé par l'opérande source. Dans une addition par exemple, la source est ajoutée à la destination et le résultat est enregistré dans la destination.

puce Enfin il y a le commentaire, celui-ci est toujours après l'instruction, commence par ; et prend fin des que vous appuyez sur la touche [ENTREE] (code ASCII 13).





 

Monter Descendre Retour La mémoire de la TI-92
Retour Généralités
Retour Taille des données en mémoire




 

Monter Descendre Retour Généralités
puce La mémoire de la TI-92 est une gigantesque série de 1 et de 0.

puce Cette mémoire est divisée en deux grandes parties :

    puce Tout d'abord la RAM, acronyme de Random Access Memory. Elle peut être modifiée et lue, ce qui nous intéresse principalement pour sauver des variables, elle intéresse aussi la TI-92... qui en utilise environ 70 Ko pour son usage personnel !
    puce Ensuite nous avons la ROM, acronyme de Read Only Memory. Elle peut être lue mais pas modifiée, contient toutes les informations nécessaires au bon fonctionnement de la TI-92 comme l'O.S, les 10.000 fonctions disponibles...
puce Notez que la comparaison RAM / ROM est impressionnante, en effet une TI-92 a 128Ko de RAM pour 1Mo de ROM, une TI-92 avec le module européen 256Ko de RAM pour 1Mo de ROM et une TI-92II 256Ko de RAM pour 2Mo de ROM.

puce Comme nous l'avons vu précédemment 8 bits forment un octet, chaque octet à une adresse pour pouvoir être accédé, elle peut être soit paire soit impaire.
Attention, l'adresse d'un mot ou un double mot est l'adresse du premier octet le composant et doit être toujours paire !
Dans le cas contraire vous provoquerez l'interruption "ADDRESS ERROR"

puce Pour visualiser la mémoire de votre TI-92 je vous conseille d'utiliser Hexview 2.4 de Benoît Scherrer disponible chez Ticalc.org.

puce Le microprocesseur peut effectuer deux actions sur la mémoire :

    puce la modifier en écrasant (remplaçant) la valeur précédente
    puce la lire ce qui n'entraîne aucune modification




 

Monter Descendre Retour Taille des données en mémoire
puce Les instructions occupent plus ou moins de mémoire (2, 4 ou 6 octets) selon leur degré de complexité. Il est parfois préférable d'utiliser telle instructions au lieu d'une autre ayant un résultat similaire dans le seul but d'utiliser moins de mémoire pour un résultat équivalent, le cas échéant vous en serez averti.

puce Un caractère étant codé sur 8 bits (octet), il ne prendra qu'un emplacement à chaque fois.

puce Une chaîne de caractère étant une suite de plusieurs caractères, celle ci occupe autant d'octets consécutif que de caractères plus un caractère de code ASCII nul pour la délimiter (à ne pas confondre avec l'espace de code ASCII 32)

puce Une valeur numérique occupera autant d'emplacement consécutifs que nécessaire :

    puce un nombre sur 8 bits (octet) utilisera un emplacement, il aura comme valeur 0 à 255 si il n'est pas signé, et -128 à 127 si il est signé.
    puce un nombre sur 16 bits (mot ou deux octets) utilisera deux emplacements consécutifs, il aura comme valeur 0 à 65535 si il n'est pas signé, et -32768 à 32767 si il est signé.
    puce un nombre sur 32 bits (double mot ou quatre octets) utilisera quatre emplacements consécutifs, il aura comme valeur 0 à 4294967296 si il n'est pas signé, et -2147483648 à 2147483647 si il est signé.
puce Attention, le Motorola 68000 enregistre toujours l'octet de poids fort en premier dans la mémoire, cette approche est appelée "little endian" (que l'on peut essayer de traduire par "faiblement terminé").
puce Si vous mettez en mémoire le mot (deux octets) $1998, il sera inscrit [$19] puis [$98].
Cette approche est différente de la majorité des autres processeurs qui auraient inscrits en mémoire [$98] puis [$19].




 

Monter Retour Les registres
puce Comme tout processeur, le Motorola 68000 est équipé de registres, 19 pour être précis
Ce sont des emplacements mémoire pour la plupart 32 bits ayant des rôles spécifiques.

puce Nous avons huit registres de données 32 bits qui servent à contenir des données, ils ont comme noms D0, D1, D2, D3, D4, D5, D6 et D7. Pour accélérer les choses nous les appellerons Dn quand nous pourrons les utiliser indifféremment pour une tache.

puce Ensuite huit registres d'adresse 32 bits qui servent à contenir des adresses (pointeurs), ils ont comme noms A0, A1, A2, A3, A4, A5, A6 et A7.
Attention, le registre A7 est le pointeur de pile. Il est donc formellement déconseillé d'utiliser un autre registre d'adresse à la place ou de modifier d'une façon quelconque le registre A7 pendant l'exécution du programme.
La raison est fort simple : le microprocesseur, donc toutes les fonctions en ROM et par conséquent les bibliothèques accompagnant Fargo utilisent le registre A7 comme pointeur de pile.
Les registres d'adresse A0, A1, A2, A3, A4, A5 et A6 seront appelés An pour accélérer les choses, quand nous pourrons les utiliser indifféremment pour une tache.

puce Puis il y a le compteur ordinal 32 bits nommé PC (program counter), qui pointe en permanence sur la prochaine instruction a exécuter.
Seuls les 24 premiers bits sont utilisés, ce qui est largement suffisant pour accéder à toute la mémoire des TI-92, c'est pour cela que la plupart des adresses données sont du type $xxxxxx ou lieu de $00xxxxxx.

puce Enfin le registre de status 16 bits nommé SR, pouvant être décomposé en deux registres 8 bits. L'octet de poids faible est le registre de status utilisateur nommé CCR et l'octet de poids fort et l'octet système. Vous aurez besoins d'en savoir plus sur le registre de status utilisateur pour les instruction. Le registre de status est totalement expliqué par ailleurs.





 

 

Lisez la section sur les droits d'auteur et la license d'utilisation avant de distribuer Zguide.

Zguide © 1998, Florian DREVET. Tous droits réservés à l'échelle mondiale