22
Rapport de projet de JAVA 8051 Simulator v0.2 Matthieu SIMON IFITEP 3 Juin 2005

Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Rapport de projet de JAVA

8051 Simulator v0.2

Matthieu SIMON

IFITEP 3

Juin 2005

Page 2: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Sommaire :

1/ Présentation du sujet Page 1

2/ Fonctionnement d'un microcontrôleur 80C51 Page 22.1/ La mémoire de données (RAM) Page 3

2.2/ L'unité centrale de traitement (CPU) Page 4

2.3/ Le contrôleur d'interruption (IC) Page 5

2.4/ Autres périphériques Page 7

3/ Méthode de conception du simulateur Page 83.1/ CORE_AsmLine & CORE_AsmParser : l'analyseur de syntaxe Page 10

3.2/ CORE_CPU8051 : le coeur du simulateur Page 10

3.3/ Opcode & Opcode... : les instructions Page 12

3.4/ CORE_HEXLoader : le support de l'instruction MOVC Page 12

3.5/ CORE_Timers & CORE_Interrupts : les périphériques Page 13

4/ Interface graphique utilisateur Page 13

5/ Le projet avec un peu de recul Page 15

6/ Annexes Page 16

Projet de JAVA 2005 IFITEP 3 Sommaire

Page 3: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

1\ Présentation du sujet

Le but est de réaliser un simulateur de microcontrôleur, ceci consiste en réalité à reproduire lefonctionnement du circuit électronique par le biais d'un programme informatique écrit en JAVA. Cedernier doit pouvoir fonctionner sur un ordinateur, il est alors possible de développer une applicationciblée sans pour autant nécessiter le matériel adéquate. Limitant ainsi les coûts de conception pour lesentreprises.

Dans notre cas il s'agit de pouvoir simuler un programme écrit par l'utilisateur et de l'informer sur sondéroulement. Il peut alors déceler et modifier rapidement son programme en cas de problèmes. Il estdonc nécessaire d'intégrer des objets de visualisations et d'informations de l'état général du circuit. Lesnouveaux microprocesseurs intègrent désormais des interfaces dites de « debug » qui permet de scruterles différents paramètres afin de contrôler le fonctionnement d'un programme. Ces interfaces sont alorstotalement matérielles et sont intégrées directement dans les masques du circuit.

Le microcontrôleur que nous souhaitons simuler est  un 80C51, coeur 8 bits  conçu il  y a quelquesannées par  Intel, il n'offre pas d'interface de debug dans sa version de base. Dans un premier tempsnous pouvons dire qu'il suffirait de scruter la mémoire de données du circuit afin de se renseigner surson état.

Ce circuit est un standard de l'industrie, de nombreux fondeurs ont développés des  microcontrôleursbasés  sur  un coeur de 80C51.   Il  propose par  défaut  une unité  centrale  de traitement  (CPU),  de lamémoire et quelques périphériques standards tels que des compteurs, des entrées­sorties  parallèles etainsi qu'un contrôleur de liaison série asynchrone full­duplex (UART). Ces différents modules serontprésentés par la suite.

Projet de JAVA 2005 IFITEP 3 Page 1 sur 16

Page 4: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Le  principe  du   simulateur   va  donc  être  d'interpréter  et  d'exécuter  à   la   volée   le   code   source  d'unprogramme, en l'occurrence du code assembleur. Il doit pouvoir aussi être capable d'afficher l'état de lamémoire de données (RAM) par l'intermédiaire d'une interface graphique. Afin d'avoir plus de contrôlesur  le  déroulement  du programme il est  nécessaire de pouvoir exécuter le programme pas à  pas etmodifier la mémoire de données. Les différents périphériques internes doivent aussi être fonctionnels.Des  composants  graphiques   sont   souvent   disponibles,   ils  permettent  de  modéliser   rapidement   despériphériques élaborés comme un écran à cristaux liquides ou encore un terminal de liaison série.

2/ Fonctionnement d'un microcontrôleur 80C51

Ci­dessous, la représentation de l'architecture interne d'un microcontrôleur 8 bits Intel 80C51 :

Projet de JAVA 2005 IFITEP 3 Page 2 sur 16

Page 5: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Comme vu précédemment, le circuit se compose par défaut de (liste exhaustive) :– 256 octets de mémoire de données (RAM), dont 128 pour les registres.– 4k octets de mémoire programme (ROM).– Une unité de centrale de traitement (CPU).– Un contrôleur d'interruption.– Un étage « oscillateur » pour générer l'horloge du circuit.– Un contrôleur de bus.– 2 compteurs 16 bits.– 4 ports parallèles 8 bits d'entrées/sorties.– Une interface série full­duplex.– Un contrôleur de bus externe permettant d'extraire du circuit le bus de données et d'adresses

afin d'étendre par exemple la mémoire.

2.1/ La mémoire de données (RAM)

La mémoire se décompose en 2 blocs distincts. Le premier, partant de l'adresse 0 et d'une taillede 128 octets, représente l'espace utilisable par le programme pour allouer la pile (STACK) et le tas(HEAP). On trouve au début de ce bloc quatre banques de 8 registres dis à usages généraux. Cettedénomination est trompeuse car on appelle typiquement « registres à usages généraux » les registresutilisés par l'unité centrale de traitement qui sont, quand à eux, contenus dans le second bloc. On trouveégalement une plage adressable au niveau du bit.Le second, de 128 octets également, est appelé SFR pour Special Function Registers. On trouve ici tousles registres internes qui régissent le fonctionnement du circuit comme l'indique la figure suivante :

Projet de JAVA 2005 IFITEP 3 Page 3 sur 16

Page 6: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

On retrouve les registres appelés généralement GPR pour General Purpose Registers :– ACC : Accumulateur 8 bits, utilisé pour les transferts mémoire et les calculs.– PSW : (Program  Status  Word) Registre d'état du microprocesseur qui contient les bits de

retenue,   de   dépassement,   de   parité,   ...   .   On   retrouve   ce   registre   dans   tous   lesmicroprocesseurs sous le nom de PSW ou CCR pour Code Condition Register.

– B : Accumulateur utilisé pour les multiplications et divisions.– SP : (Stack Pointer) C'est le pointeur de pile.– DPH­DPL : (DPTR) Registre 16 bits utilisé pour les transferts avec la mémoire externe.

A noter que le PC (Program Counter) n'est pas accessible via l'adressage mémoire. Il ne peut donc pasêtre  modifier  par  programme,   seuls   les   instructions  de  branchement  peuvent  modifier   le  compteurordinal.

2.2/ L'unité centrale de traitement (CPU)

C'est en réalité  le microprocesseur du circuit, il se compose des différents éléments que l'onretrouve couramment dans ces derniers. On l'appelle souvent « coeur » (ou CORE) car elle forme lapièce maîtresse de tout système à microprocesseur, avec la mémoire.

Les documentations techniques fournies par les constructeurs ne présentent pas énormément de détailssur l'architecture du coeur, on peut donc considérer qu'elle ressemble étroitement à une architecture 8bits standard. Elle a donc la particularité de pouvoir exécuter son propre jeu d'instructions, le 80C51étant   de   type   CISC,   le   jeu   est   conséquent   (une  quarantaine   d'instructions)   et   la   longueur   de   cesdernières n'est pas fixe.  Comme tout microprocesseur, une unité de contrôle est présente permettant derécupérer une instruction depuis la ROM (Fetch), de la décoder (Decode) et de l'exécuter suivant sontype. Trois types d'exécutions se distinguent vraiment et sont communes à tous les microprocesseurs :

– Transferts de mémoire ROM et RAM : toutes les instructions qui écrivent/lisent la mémoire.– Branchements   vers   une   sous­routine   :   sauts   relatifs   et   absolus,   consiste   à   modifier   le

compteur ordinal (PC), en l'ayant sauvegardé auparavant dans la pile (uniquement lors desauts absolus).

– Calculs   en   nombres   entiers   :   réalisés   par   l'unité   arithmétique   et   logique   (ALU),   unitématérielle   spécialement   dédiée   pouvant   réaliser   des   opérations   booléennes,   additions,soustractions, multiplications et divisions sur 8 bits. A noter que l'ALU d'un 80C51 proposedes opérateurs logiques au niveau des bits.

Projet de JAVA 2005 IFITEP 3 Page 4 sur 16

Page 7: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Le diagramme ci­dessous représente l'architecture du CPU d'un 80C51 :

A chaque front montant de l'horloge système, cette machine d'état est active, il faut alors 12 périodesd'horloge pour réaliser un cycle machine complet. En outre, les instructions ne nécessitent pas toutes lemême nombre de cycles machines pour être exécutées, le temps passé dans chaque état n'est donc pas lemême.

2.3/ Contrôleur d'interruption (IC)

Il est en relation avec les deux périphériques principaux, les deux compteurs et l'interface série.Deux sources externes d'interruption, sur état logique ou sur front descendant, sont aussi disponibles, cequi   porte   à   cinq   le   nombre   de   vecteurs   d'interruptions.   Outre   les   registres   de   configuration   despériphériques, deux sont présent pour autoriser les interruptions (IE) et modifier leur niveau de priorité(IP).

Projet de JAVA 2005 IFITEP 3 Page 5 sur 16

Page 8: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Table des vecteurs d'interruptions :

Adresse du vecteur Source d'interruption Indicateur

0x0003 Externe 0 IE0

0x000B Timer 0 TF0

0x0013 Externe 1 IE1

0x001B Timer 1 TF1

0x0023 Rx­Tx UART RI + TI

A chaque cycle machine,   le contrôleur  résout   les   interruptions en attente  ainsi  que leur priorité  etprovoque un saut absolu au vecteur d'interruption correspondant au résultat de cette résolution. Lors dece saut, une sauvegarde de contexte est effectuée, la valeur du compteur ordinal est sauvegardée dans lapile et   le  pointeur de pile  (SP)  est   incrémenté.  La routine d'interruption est  alors exécutée  jusqu'àrencontrer   l'instruction   RETI,   qui   signifie   retour   d'interruption,   le   contexte   précédent   est   ensuiterechargé depuis la pile.

Les indicateurs d'interruption sont  échantillonnés durant chaque cycle machine, l'échantillon est alorsanalysé   au  cycle   suivant.  Si  un des   indicateurs   est   actif   lors  de  cette  échantillonnage,   le   systèmed'interruption génère l'appel au sous­programme, cet appel est bloqué si l'une des conditions suivantesest détectée :

– Une interruption de même niveau de priorité ou de niveau supérieur est déjà en cours.– Le cycle machine correspondant  à   l'analyse n'est  pas   le dernier  de  l'instruction en cours

d'exécution.– L'instruction en cours d'exécution est un ordre de retour de sous­programme (RETI) ou une

instruction correspondant à une écriture dans l'un des registres IE ou IP.

Cette dernière condition assure l'exécution d'une instruction après modification des registres définissantle mécanisme des interruptions et après le saut correspondant au retour de traitement de l'interruption.Si une interruption n'est pas prise en compte, alors l'indicateur est écrasé au cycle suivant par le nouveléchantillon.

Projet de JAVA 2005 IFITEP 3 Page 6 sur 16

Page 9: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Structure générale du contreur d'interruption du noyau 80C51 :

2.4/ Autres périphériques

Les trois blocs ci­dessus, la RAM, le CPU et l'IC, forment le microcontrôleur dans sa version laplus basique. En ajoutant de la ROM, le système peut alors fonctionner en autonomie cependant sonutilisation reste limitée à du calcul et des transferts mémoires. Comme vu plus haut, le 80C51 proposedes périphériques de bases :

– Compteurs 16 bits (TIMER) : comme tous les compteurs, ils peuvent fonctionner en mode :– Output  Compare (temporisateur)   : à  chaque cycle machine,  le  registre  interne est

incrémenté. Permet de générer de signaux de type PWM par exemple.– ou   Input  Capture   (compteur)   :  A chaque   front  descendant   du   signal  d'entrée,   le

registre interne est incrémenté. Permet par exemple de mesurer le rapport cycliqued'un signal.

Il y a en réalité quatre modes fixés par le biais des bits M0 et M1du registre TMOD :– Mode   0   :   Comparable   aux   compteurs   de   la   famille   MCS­48.   Il   fonctionne   en

compteur 8 bits et propose un pré­diviseur de 0 à 32 (5 bits).– Mode 1 : Compteur sur 16 bits.– Mode 2 :  Compteur  sur  8 bits  à  rechargement  automatique.  Lorsque le  compteur

Projet de JAVA 2005 IFITEP 3 Page 7 sur 16

Page 10: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

déborde (passe de 0xFF à 0x00), il est automatiquement rechargé avec une valeur pardéfaut. Ceci permet de générer des temporisations très précise.

– Mode 3 : Le compteur 0 fonctionne en double compteur 8 bits, le premier est contrôlépar le registres du TIMER0 et le second par ceux du TIMER1.

– Ports d'entrées/sorties (IO) : Il y a quatre ports parallèles d'une largeur de 8 bits chacun. Ceslignes sont bidirectionnelles et fonctionnent en tout ou rien. Quatre registres internes P0 à P3permettent de lire/écrire l'état des ports.

– Interface série full­duplex : Elle permet d'émettre et de recevoir simultanément. Elle possèdequatre modes de fonctionnement et le taux de transfert est paramétrable par le TIMER1.

3/ Méthode de conception du simulateur

La présentation du fonctionnement du microcontrôleur 80C51 ci­dessus propose une premièrevision du simulateur.   Il   reprend globalement   le   fonctionnement décrit  plus  haut  avec  la  différencenotable que le code simulé est directement le code assembleur écrit par le programmeur, et non le codemachine compilé et dont les liens sont édités.

Ceci pose le premier problème, doit­on simuler du code de haut niveau ou du code machine ?Il n'y a pas de réponse juste, dans les deux cas un traitement préliminaire est nécessaire. Dans celui d'uncode de haut niveau, il faut nécessairement passer par une phase de pré­compilation. Par analogie, dansle cas d'un code machine, une phase de simili­désassemblage est obligatoire. Ce qui revient donc aumême. Mon choix a été de prendre la solution du code de haut niveau, j'aurais très bien pu opter pourl'autre solution mais il fallait bien choisir. Par ailleurs, ce choix fixe l'architecture du simulateur, il estdonc primordial de se fixer sur une solution pour toute la suite du problème.

Au niveau de la  hiérarchie  on trouve le coeur (classes CORE_*) qui est totalement indépendant del'interface graphique.  En  théorie,   il   serait   tout  à   fait  possible  de reprendre  ce coeur   tel  quel  et  del'intégrer dans une autre application. Au dessus se trouve l'interface utilisateur, elle comporte une et uneseule instance du coeur.

J'ai commencé par concevoir un analyseur de code assembleur (Parser), il permet de récupérer chaqueinstruction contenue dans un fichier source sans tenir compte des différents commentaires et autreschoses qui sont susceptible d'être présent dans le fichier.A partir de ce Parser, j'ai pu commencer à réaliser le coeur du système en partant par le décodage desdifférentes instructions et modes d'adressages de base. Je me suis fortement inspiré de la machine d'étatvu précédemment en ajoutant quelques modifications au moment de l'implémentation.

Projet de JAVA 2005 IFITEP 3 Page 8 sur 16

Page 11: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Une base a  vite été  opérationnelle,  à  partir  de ce moment  j'ai  pu facilement développer  toutes  lesinstructions et modes d'adressages.

J'ai ensuite commencé  à  réaliser une ébauche de l'interface graphique actuelle. En effet, auparavantj'utilisais un terminal pour la visualisation,  le coeur commençant à  être de plus en plus complet, ildevenait difficile de tout visualiser sur la console.Je   me   suis   consacré   enfin   à   la   conception   des   différents   périphériques   internes   et   ainsi   qu'auxcomposants graphiques.

Ci­dessous le diagramme des différentes classes JAVA qui forment le coeur, elles seront développéespar la suite :

Projet de JAVA 2005 IFITEP 3 Page 9 sur 16

Page 12: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

3.1/ CORE_AsmLine & CORE_AsmParser : l'analyseur de syntaxe

La classe CORE_AsmLine représente une ligne de code assembleur. On distingue pour cettedernière trois types :

– OPCODE : c'est une instruction, elle possède des opérandes et une adresse dans la mémoireprogramme. Une instruction peut être sujette à un point d'arrêt.

– LABEL : c'est une étiquette, représente une adresse en mémoire programme.– DIRECTIVE   :   c'est   une   directive   assembleur,   utilisée   uniquement   par   le   logiciel   qui

assemble le code source.

La classe CORE_AsmParser permet  de récupérer chaque ligne de code à  partir  d'un fichier sourceprésent sur le disque dur de l'ordinateur. A chaque appel de la méthode « getAsmLine » le Parser renvoila ligne suivante contenue dans le fichier sous forme d'objet de type CORE_AsmLine. Le principe estde lire le fichier ligne par ligne, d'enlever les différents commentaires (symbolisés par un « ; ») et dedéterminer quel type de ligne vient d'être lu. Dans le cas d'une instruction, il faut ensuite récupérertoutes les opérandes.

3.2/ CORE_CPU8051 : le coeur du simulateur

Cette classe est en réalité  le coeur de tout le programme. Elle fonctionne à  partir d'un codesource   généré   par   le   Parser,   un   objet   de   type  ArrayList  contenant   toutes   les   lignes   de   typeCORE_AsmLine est nécessaire. Comme on peut le voir sur le diagramme de classe, CORE_AsmParserne dépend par directement de CORE_CPU8051, c'est donc à la classe instanciant le CPU de faire appelau Parser pour générer l'ArrayList.A   partir   de   cette   ArrayList,   une   phase   de   simili­assemblage   est   réalisée   où   toutes   les   directivesd'assemblages sont résolues et où les adresses sont calculées sauf celles des registres SFR. Par exemple,toutes  les étiquettes sont résolues et  affectées  aux instructions de branchement,  toutes  les variablesutilisateurs de type « equ » sont remplacées par leur adresse respective.Ensuite, cette ArrayList est chargée dans la mémoire dite « virtuelle », d'une taille de 2^15 instructionsde type CORE_AsmLine, elle représente une mémoire simulée où toutes les instructions sont d'unelongueur de 1 CORE_AsmLine. On ne peut pas parler d'octets ici car on ne connaît pas la taille dechaque instruction puisqu'elle  peut  varier  en fonction de son mode d'adressage (caractéristique desCISC).

Par   ailleurs,   la   classe  CORE_CPU8051  intègre  des   champs   statiques  qui   sont   les  256k  octets  demémoire de données (RAM) ainsi que la définition des différents registres SFR. Elle intègre aussi 64koctets de mémoire ROM utilisés pour l'instruction MOVC (voir CORE_HEXLoader) et 8k octets demémoire RAM externe.

Projet de JAVA 2005 IFITEP 3 Page 10 sur 16

Page 13: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

La pièce maîtresse de cette  classe est   l'ordonanceur (Scheduler)  qui  reprend  intimement celui d'un« vrai » 80C51 :

Le cycle commence par l'état « Update Timers », à chaque appel de la méthode « scheduleCPU » lecycle complet est  effectué.  Chaque instruction ne nécessite pas le même nombre de cycles machinepour être exécutée, or le cycle ci­dessus exécute toutes les instructions en une fois, il faut donc corrigerles compteurs du nombre de cycles réels moins un. Ce cycle pose un autre problème, dans le mêmeesprit, les interruptions ne sont pas échantillonnées aussi souvent qu'elles devraient l'être, il en résulteun   comportement   non   déterministe.   Un   décalage   sur   l'exécution   des   routines   d'interruptions   peutintervenir mais il ne peut pas dépasser 3 cycles machines.

Le   décodage   de   l'instruction   se   fait   par   l'intermédiaire   d'un   tableau   associatif,   de   type   Opcode,contenant une référence vers chaque classe Opcode... . Un autre tableau, contenant lui le nom (sousforme d'une chaîne de caractères) de toutes les instructions, permet de faire correspondre les index desdeux tableaux et donc d'appeler automatiquement la méthode « execute » de la bonne instruction parpolymorphisme. Il suffit juste de trouver le nom de l'instruction pour connaître l'index dans le tableau.

Projet de JAVA 2005 IFITEP 3 Page 11 sur 16

Page 14: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

3.3/ Opcode & Opcode... : les instructions

La classe Opcode,  déclarée comme étant  abstraite,   forme  le  squelette d'une  implémentationstandard d'une instruction. Seule la méthode « execute » doit être redéfinie dans chaque classe héritantde   Opcode,   en  l'occurrence  toutes  les   instructions.   Deux   méthodes   de   type   « protected »   sontprésentent, l'une pour le décodage du mode d'adressage de chaque opérandes et l'autre pour effectuéesun saut relatif vers une adresse en mémoire programme.

La méthode « decodeAddressingMode » réalise une analyse syntaxique de l'opérande et en fonction dumode d'adressage elle retourne l'adresse dans la RAM.

– Immédiat : présence d'un « # » devant l'opérande. Une case mémoire à l'adresse 0x100, quin'est donc pas dans la plage d'adressage interne, contient la valeur à affecter. La méthoderetourne alors l'adresse 0x100.

– Indirect  par  registre  :  présence d'un « @ » devant   l'opérande.  Résolution de  l'adresse duregistre via une table (Cf. resolveRegisterAddress).

– Par registre : L'opérande est le nom d'un registre. Résolution de l'adresse comme ci­dessus.– Au niveau du bit : Présence d'un « . » dans l'opérande (P0.1). Sauvegarde le bit pointé dans

une   case   mémoire   à   l'adresse   0x101   à   l'instar   de   l'adressage   immédiat   et   appellerécursivement   la   méthode   « decodeAddressingMode ».  Il   s'agit   ensuite,   au   moment   del'exécution, de vérifier que la case 0x101 contient une valeur de 0 à 7 indiquant le rang dubit.

– Indexé : Présence d'un « + » dans l'opérande (REG+1). Ajoute le nombre à droite du « + » aurésultat de l'appel récursif de « decodeAddressingMode » pour la partie à gauche du « + ».

– Direct : C'est directement l'adresse écrite en base 10 ou 16.

Chaque classe représentant les instructions a été déclaré héritant de Opcode et la méthode « execute »surchargée par l'opération propre à l'instruction. Elles suivent toutes le même schéma :

– Décodage de toutes les opérandes.– Réalisation du travail du l'instruction.– Incrémentation du compteur de cycle machine suivant l'instruction.

3.4/ CORE_HEXLoader : le support de l'instruction MOVC

Puisque le simulateur exécute le code source assembleur à la volée, le code machine n'est pasdirectement accessible  pour réaliser des  transferts  avec la ROM. L'instruction MOVC est  d'ailleursfaites pour cela, elle permet de réaliser des transferts de le sens mémoire programme ­> mémoire dedonnées.   Afin   de   supporter   cette   instruction,   il   faut   pouvoir   avoir   le   code   machine,   le   fichierhexadécimal généré  par un compilateur fait   très bien l'affaire,  c'est  d'ailleurs celui­là  même qui est

Projet de JAVA 2005 IFITEP 3 Page 12 sur 16

Page 15: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

généralement chargé dans le circuit par l'intermédiaire d'un « Loader ». D'où le nom de cette classe quipermet   de   charger   le   code,   lu  à   partir   d'un   fichier  HEX,  dans   la  mémoire  de  64k  octets   décriteprécédemment.

La classe CORE_HEXLoader  permet  de charger un  fichier  source,  au  format   INTEL 16 bit   IHX,présent sur le disque dur. Le principe est très simple, chaque ligne du fichier commence par « : », ontrouve ensuite différents champs comme la taille des données contenues sur la ligne et les données àproprement parler. Un champs permettant de vérifier la validité  des données est aussi présent. A laconstruction d'un objet de type CORE_HEXLoader, les lignes du fichier sont lues unes par unes et leCRC   (Cyclic  Redundancy  Check)   est   vérifié.   Si   ce   dernier   est   valide   on   écrit   dans   la   mémoireprogramme.

3.5/ CORE_Timers & CORE_Interrupts : les périphériques

Le contrôleur d'interruption et les compteurs bénéficient de leurs propres classes.

Comme expliqué   plus  haut,  à   chaque appel  de  « scheduleCPU »,   les   interruptions   sont   servis.  Laméthode   « checkPendingINT »   vérifie   les   interruptions   en   attente,   ensuite   la   méthode« interruptHandling » permet de servir l'interruption de plus haut niveau de priorité demandée.A noter que les interruptions imbriquées (Nested Interrupts) ne sont pas supportées.

Quand aux compteurs, la classe ne possède qu'une seule méthode « updateTimer » qui met à jour lesdeux compteurs l'un après l'autre. En fonction des bits de configuration contenus dans les registres descompteurs, le registre de comptage est incrémenté suivant le mode de fonctionnement sélectionné.A noter que le Mode 3 n'est pas supporté.

4/ Interface graphique utilisateur

L'interface utilisateur (GUI) se base sur cinq fenêtres par défaut, une console, un affichage ducode source, ainsi que des registres, de la mémoire de données interne et externe et enfin des portsd'entrées/sorties.

La classe principale est « Simulatro8051 », elle est la seule à comporter une méthode « main ». Héritantde la classe JFrame, elle forme l'application, toutes les autres fenêtres héritent de la classe JDialog. Elleimplémente  également l'interface « Runnable » afin de créer un nouveau processus utilisé  lorsque lesimulateur est en mode « Run » (Cf. 8051 Simulator v0.2 Documentation). A noter que l'instance duCORE est présente dans cette classe.

Projet de JAVA 2005 IFITEP 3 Page 13 sur 16

Page 16: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Ci­dessous le diagramme de classe de l'interface graphique :

L'interface graphique constitue un gros travail de recherche dans la documentation de l'API JAVA, iln'est pas très intéressant de la développer dans ce rapport. Quelques particularités sont quand même ànoter :

– Simulator8051 : Possède un Thread pour le mode Run, les différentes erreurs émisent par leCORE sont réceptionnées et affichées dans la console, le Thread est alors stoppé.

– GUI_SourceCodeDialog : Affiche le code source directement depuis le fichier et non pas lamémoire du CORE. On trouve dans cette classe les méthodes pour mettre/enlever les pointsd'arrêts dans la mémoire du coeur cette fois ci.

– GUI_DataMemoryDialog : Affiche le contenu de la mémoire par groupe de 8 octets, chaquegroupe se situe sur une ligne. Des méthodes sont prévues pour pouvoir modifier directementla mémoire du coeur (déclarée statique).

Projet de JAVA 2005 IFITEP 3 Page 14 sur 16

Page 17: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

– GUI_SFRDialog  :   Se   comporte   exactement   comme   GUI_DataMemoryDialog   en   plussimple.

– GUI_IOPorts  :   Affiche   l'état   des   ports   d'entrées/sorties   sous   forme   de  JCheckBox.  trèsbasique.

– GUI_7SegDisplay : Simule un afficheur 7 segments sur 4 bits. C'est le seul composant quifait   intervenir  du graphisme.   Il   est  possible  d'en ouvrir  4  au maximum, cette  valeur  estfacilement modifiable.

– GUI_UART : Simule un terminal UART. Son fonctionnement est très simple, il détecte leslecture/écriture sur le registre SBUF. Lorsque SBUF est écrit par programme, le terminalattrape   la   valeur   et   l'affiche  dans   la   fenêtre.  Par   ailleurs,   lorsque   l'utilisateur   envoi  descaractères par le biais de cette même console, SBUF reçoit ces derniers.

La création de l'interface graphique est longue et fastidieuse, je vous invite à regarder la documentationJAVADOC pour de plus ample détails.

5/ Le projet avec un peu de recul

Ce premier projet de JAVA m'a permis d'apprendre beaucoup sur le langage, j'ai pu mettre àprofit mes acquis lors des différents travaux pratiques effectués. J'ai encore énormément de choses àapprendre mais je commence vraiment à me rendre compte de sa puissance et de ses défauts. Dansl'ensemble   je   retiens   une   facilité   d'écriture   et   de   debug   du   code   ainsi   que   la   puissance   de   laprogrammation orientée objet.

J'ai pu aussi travailler sur une nouvelle architecture qui m'était alors uniquement connue de nom. Eneffet, avant ce projet, je n'avais jamais travaillé sur un microcontrôleur 80C51, je n'ai heureusement paseu de problème pour la compréhension de son fonctionnement interne.

Ce qui m'amène aussi à noter que j'ai énormément utilisé mes connaissances en électronique numériqueet en langage C pour l'appréhension du sujet et tous les algorithmes spécifiques au coeur du simulateur.J'ai su tout de suite comment partir et je n'ai jamais été bloqué, je me suis posé beaucoup de questions.Je suis passé par des phases structurées de  réflexions en posant les problèmes mais je n'ai jamais étévraiment en grande difficulté pour ce qui est de l'avancement.

J'ai beaucoup travaillé, non pas parce que le sujet été difficile mais parce qu'il est très vaste et devaittenir dans un laps de temps très court. Je n'est malheureusement pas pu faire tout ce que je m'étais fixé,le coeur n'est pas fonctionnel à cent pour cent à cause du non­support du Mode 3 des compteurs et desinterruptions imbriquées. D'autres composants graphiques auraient été également judicieux.

Projet de JAVA 2005 IFITEP 3 Page 15 sur 16

Page 18: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

Matthieu SIMON 8051 Simulator v0.2

Dans   l'ensemble,   je   suis   très   satisfais   d'avoir   eu   à   travailler   sur   ce   sujet,   je   l'ai   trouvé   vraimentintéressant. Cette satisfaction est encore plus forte quand je m'aperçois que mon application est assezperformante dans cette version peu évoluée.

6/ Annexes

– Documentation utilisateur de la version 0.2 du logiciel 8051 Simulator. En anglais.

Projet de JAVA 2005 IFITEP 3 Page 16 sur 16

Page 19: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

8051 Simulator v0.2 Documentation

This program is free software; you can redistribute it and/or modify it under the terms of the GNUGeneral Public License as published by the Free Software Foundation; either version 2 of the License, or

(at your option) any later version. This program is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. Youshould have received a copy of the GNU General Public License along with this program; if not, write to

the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111­1307 USA 

The file COPYING contains the full text of the GNU General Public License, Version 2.

TABLE OF CONTENTS

● What is this ?   ● How does it work ?   ● What do i need to use it ?   ● How to use it ?   ● Assembly Source Code specifications   ● HEX disassembler   ● Windows OS specifications   ● Linux OS specifications   ● Links – Books   ● Author   

1/ What is this ?

8051 Simulator is an Intel 80C51 Core Simulator wrote in JAVA. It provides a complete emulated 80C51core with some restrictions such as the source code syntax. Above this core, there is a Graphical UserInterface which offers useful features as source code window, memory edit, step by step debug andgraphical components.Core supports :

● Complete 80C51 Instructions and Registers Sets● 256 bytes of Internal RAM● 8k bytes of External RAM● 64k bytes of ROM● Five Interrupts Fixed Vectors (Two external sources)● Two 16 bit Timers● Four Parallel IO● UART

2/ How does it work ?

8051 Simulator is able to simulate ASCII Assembly Source Code on the fly. It assembles the code into aspecific simulator understandable form where all the addresses are calculated but the mnemonics still inan ASCII format.

Page 20: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

This sets the first restriction of this simulator, a fake program memory area is simulated where allinstructions (composed by a mnemonic and some operands) have a fixed length; 1 byte. The special ORGassembly directive (syntax .or) is provided to fix this restriction in order to set interrupt vectors orspecial routines.Because of the simulated program memory, the MOVC instruction needs the HEX assembled code, it isloaded automatically with the ASM file if it exists. In order to have the MOVC instruction supported youhave to assemble your source code with an Assembler as ASX8051. The simulator provides an internalHEX loader which understands INTEL IHX 16bit format.The internal core is based on a scheduler; each time the scheduler runs, the timers are updated, theinterrupts are resolved and serviced, the next instruction pointed by the Program Counter is fetched fromthe fake internal memory. This one is then decoded depending on its addressing mode and executed. Afterthat, the machine cycles counter is incremented by the corresponding number of cycles depending on theexecuted instruction. Since the 80C51 instructions do not need the same amount of machine cycles to beexecuted, the interrupt latency is not deterministic; nested interrupts are not supported either.

3/ What do I need to use it ?

Since it has been written using JAVA 1.4.2, you only need version 1.4.2 or above JVM. You can find oneat http://java.sun.com/The main class is Simulator8051.classSee compatibility sections (Linux/Windows) for more details depending on your operating system.

4/ How do I use it ?

The GUI is based on a master window which provides a Menu and a Console. Four other windows arelaunched by default :

● Source Code : Shows the assembly source code and the address of each instruction. It is possibleto easily set Breakpoints on instructions. The current value of the PC is shown by highlighting thecorresponding line.

● Data Memory : Shows the internal (top of the frame) and external (bottom) RAM. Values areeditable by double­clicking on the cell. Numbers are in hexadecimal base.

● SFR : Shows the 80C51 Special Function Registers. As Data Memory window, values are editableand represented in HEX base.

● IO Ports : Shows/edits the state of the four general purpose I/O ports.

Two types of graphical components are also provided :● 7 Segments Display : Allows the user to easily configure a 7 segment display using a 4 bit bus

connected to general purpose I/O ports. Four displays maximum at the same time.● UART Terminal : Simulates the UART module, it logs characters received from the core and

transmits the user­input ones, as a simple RS232 terminal. Only one terminal is possible.

Since source code editing is not possible directly through the simulator window, there is a Reloadcommand to refresh the source code and reset the core.The Debug feature is composed of four types of commands :

● Reset : Resets the core registers by default.● Run : Puts the core in a free running mode. Only the Cycles Counter is still being updated, as the

graphical components. When a breakpoint or an error is caught, the core automatically returns toan idle mode, updating all of the graphical views.

● Break : Puts the core into an idle mode.

Page 21: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

● Step : Executes an instruction and updates the GUI.In the case of a caught error, Run and Step commands are disabled, the core must be reset in order to re­enable these commands.Errors are echoed in the Console, they usually append in the case of instruction fetch, instruction decodeor addressing mode errors.

5/ Assembly Source Code specifications

A LABEL MUST NOT BE ON THE SAME LINE AS AN INSTRUCTION.e.g. :

LABEL:MNEMONIC <operand1>, <operand2>, <operand3>

Numbers can be represented in Decimal or Hexadecimal Base, Binary Base is not supported. Two syntaxare possible for the Hex Base :

● Ox prefix : 10 ­> 0xA● h suffix : 10 ­> Ah

8051 Simulator can interpret three different Assembly directives :● EQU : Defines a user variable. Example : MY_VAR .eq 0x30● ORG : Sets the location of the next instruction into program memory. Example : .or 0x3● DB : Reserves space in RAM at the address contained in the above label. Example :

X0040:

.db 0xF ; reserve 15 bytes space @ 0x40

The label must be named as shown above : X<hex_address>

6/ HEX disassembler

There is a hex disassembler provided in the package called d52m.It is modified from http://home.pacbell.net/theposts/d52manual.html to meet 8051 Simulator Source Codespecifications.Modifications are :

● Assembly directives have now a fixed length about three characters.● There is a dot before each assembly directive.● Instructions can not be on the same line as a label.

Sample bash script to produce assembly and hex files from a C program (with d52m executable file in thesame directory) :

#!/bin/shif [ ­n "$1" ]thenfile=$1elseecho "No source code"exitfiif [ ­n "$2" ]thenout=$2elseout="out.asm"

Page 22: Rapport de projet de JAVAdonpichol.free.fr/IFITEP/JAVA/Simulator8051.pdf · Matthieu SIMON 8051 Simulator v0.2 Structure générale du contreur d'interruption du noyau 80C51 : 2.4

fiecho "SDCC Compilation"sdcc $filerm *.lnk *.lst *.map *.mem *.rel *.rst *.sym *.asmmv *.ihx out.hexecho "Disassemble Binary File"./d52m outmv out.hex $out.hexmv out.d52 $out

7/ Windows OS specifications

To run 8051 Simulator, launch the script Simulator8051.bat.You have to add to your environment variable the J2RE binaries path in order to get the JAVA command.

8/ Linux OS specifications

To run 8051 Simulator, launch the bash script Simulator8051.There is a way to simulate C source code using SDCC compiler. It generates IHX code, which can bedisassembled with d52m. Pay attention to the corresponding script to see how to use SDCC.

9/ Links ­ Books

● JAVA : http://java.sun.com/● SDCC : http://sdcc.sourceforge.net/● D52 : http://www.8052.com/users/disasm/● 80C51 documentations : http://www.pjrc.com/tech/8051/datasheets.html

Bernard ODANMicrocontrôleurs 8051 et 8052, description et mise en oeuvre,Editions DUNOD, ISBN 2­10­001764­0

10/ Author

My name is Matthieu SIMON, 23 years old, I am a French undergraduate engineer of “Université Pierre& Marie CURIE” (Paris – France). This 8051 simulator is part of a school project I did. Although thereare already a lot of 80C51 simulators, this JAVA one can interest some people, which is why I released iton General Public License.Please, feel free to contact me : [email protected] questions or feedback is welcomed.

Powered By IFITEP – July 2005