PAGE 1-------------------------------------------------------------------- COMPRENDRE LES MICROPROCESSEURS UNDERSTANDING MICRORPCOESSORS DOLPHIN SYSTEM J.-D. Nicoud TABLE DES MATIERES Première partie: Introduction au système DAUPHIN 1. Introduction 2 2. Système microprocesseur 2 3. Programme 3 4. Exécution du programme 4 5. Signaux processeur 5 6. Signaux mémoire 5 7. Signaux et interfaces 7 8. Programme et interface simplifiés 7 9. Boucles d'attente 8 Deuxième partie: Programmation du processeur SIGNETICS/PHILIPS 2650 1. Introduction 9 2. Registres internes du 2650 9 3. Instructions de transfert entre registres et mémoire 10 4. Instructions d'initialisation des registres 12 5. Instructions de transfert entre registres et périphériques 12 6. Complément à 1 et à 2 12 7. Adressage relatif 14 8. Adressage d'état 16 9. Registre de mode 17 10. Opérations arithmétiques d'addition 17 11. Opération de soustraction 19 12. Opérations logiques 23 13. Opérations de décalage 24 14. Opérations d'incrémentation et de décrémentation 25 15. Opérations de comparaison et de test 25 16. Instructions de saut 26 17. Décomptage avec saut 30 18. Appel de sous-programmes 31 19. Instructions diverses 33 20. Adressage indexé 34 21. Adressage indirect 37 22. Adressage indexé indirectement 38 23. Instructions spéciales d'entrée-sortie 39 24. Interruption 39 Annexes: Tables mnemo-nics 20-21 Conversion Signetics - mnemo-nics 40 Juin 1977, dexième édition Janvier 1978 PAGE 4-------------------------------------------------------------------- numérique associée à ce nom est déclarée au début du programme. Les deux instructions suivantes sont du même type et mettent la sortie de l'interface à l'état l (membrane attirée, lampe allumée). Le programme se termine par une instruction de saut !jump! à l'instruction dont l'addresse est donnée sous forme symbolique: OSCIL, dont la valeur est 0. Lorsque ce programme est exécuté, la fréquence d'oscillation du haut-parleur dépend de la vitesse du processeur. Nous verrons plus loin comment perfectionner ce programme pour rendre la fréquence d'oscillation réglable indépendamment de celle du processeur. 4. EXECUTION DU PROGRAMME Lorsque le programme est chargé en mémoire (par des interrupteurs de contrôle ou gr âce à un programme spécial de chargement), l'exécution peut commencer. Un signal de remise à zéro est nécessaire sur chaque processeur pour l'initaliser et lui faire chercher la première instruction, en général à l'adresse 0. Dans ce cas, si notre petit programme est seul en mémoire, il doit commencer à l'adresse 0, ce qui est précisé par la pseudo-instruction .LOC 0 (instruction pour le programme ou la personne effectuant la traduction en binaire du programme). La première phase de l'instruction est la recherche !fetch! de l'instruction proprement dite. Le compteur d'adresse PC place son contenu sur le bus d'adresse et sélectionne le mot correspondant en mémoire. Le contenu est transféré par le bus de donnée dans le registre d'instruction (Fig. 2a). Dans la 2e phase de cette première instruction, les circuits de décodage du processeur reconnaissent qu'il s'agit d'une instruction de charge d'une immédiate dans l'accumulateur et exéctutent !execute! le transfert de la valeur dans A (Fig. 2b). Simultanément, le compteur d'instructions PC est augmenté de 1 (incrémenté). Un nouveau cycle d'instructions ira donc chercher le code de l'instruction à l'adresse 1 (Fig. 2c). Le décodage de cette instruction indique au processeur qu'il s'agit d'un transfert vers un périphérique. L'adresse du périphérique, qui fait partie de l'instruction, est placée sur le bus d'adresse, un signal de contrôle adéquat sélectrionne le périphérique et non pas la mémoire, et la valeur contenue dans A est transférée dans le registre du périphérique sélectionné (Fig. 2d). A noveau le compteur d'adresse de programme est augmenté pour passer à l'instruction suivante. Les deux instructions qui suivent étant d'un type connu, passons à la 5e instruction, qui est tout d'abord tramsférée (Fig. 2e) avant d'être reconnue comme un saut inconditionnel. Dans ce cas, l'adresse du saut est transférée dans le compteur d'adresse (PC), au lieu de l'incrémentation habituelle (Fig. 2f). L'instruction suivante sera recherché à cetta adresse. Les explications ci-dessus ne tiennent pas compte des contraintes imposées par le codage en binaire des instructions, valeurs immédiates, adresses de périphériques et adresses de saut en mémoire. Il a été supposé que chaque instruction correspond à un seul mot mémoire. Dans les microprocesseurs actuels, des mots de 8 bits sont utilisés, cetta valeur étant un compromis courant entre les performances, d'autant meilleures que le mot est long, et le prix qui dépend des possibilités d'intégration dans un nombre minimum de circuits intégrés. Il faut dans ce cas coder les instructions en utilisant un, deux ou trois (quatre dans le Z80) mots mémoire consécutifs. Le programme ci-dessus, codé pour le 2650, a l'allure suivante: [Listing] PAGE 5-------------------------------------------------------------------- [Listing (cont.)] On remarque que les adresses sont numérotées en octal et non pas en décimal. De même les contenus sont en octal. Le système utilisé est en fait le binaire. L'octal et l'héxadécimal sont utilisés comme notations condensées du binaire. L'un des avantages de l'octal est que la conversion en binaire est plus rapide, et que les opérations sont plus faciles (10 110 011 = 263; 127 + 34 = 163). Les nombres décimaux sont suivis d'un point pour éviter toute confusion (26.=32). L'exécution du programme pour 2650 se fait selon la même séquence, mais plusieurs transferts (cycles) !cycles! sont nécessaires pour chaque instruction. Chaque cycle peut lui-même nécessiter plusieurs impulsions d'horloge, le processeur devant passer par une succession d'états !states! pour effectuer un transfert (sortir l'adresse, sélectionner la mémoire ou le périphérique, effecteur le transfert, incrémenter le PC). Lorsque le programme est effectué en pas à pas !step! lors de la mise au point, il peut dont s'agir de trois types de pas à pas: état par état !state step!, cycle par cycle !cycle step! ou instruction par instruction !instruction step!. On peut aussie imaginer des pas plus grands si des circuits de décodage appropriés sont implémentés. 5. SIGNAUX PROCESSEUR Comme déjà mentionné, le processeur doit recevoir un signal de contrôle pour être initalisé, remis à zéro !reset!. Il doit ensuite sélectionner la mémoire ou les périphériques en lecture !read! ou en écriture !write!. Chaque processeur utilise pour cela des signaux différents, qui se ramènent avec une logique simple aux signaux suivants. ADMEM (M): Sélection d'une adresse mémoire ADPER (P): Sélection d'une adresse périphérique WRITE (W): Indique qu'une écriture est effectuée. Pour différentes raisons, les signaux de contrôle sont inversés sur le bus et s'appellent ADMEMLOW, WRITELOW et RESETLOW pour montrer qu'ils sont actifs à l'état zéro, bas !low!. Par exemple, pour une lecture en mémoire, il faut WRITE = 0, la lampe correspondante est éteinte, mais sur le bus WRITELOW = 1. La notion de lecture et d'écriture est tojours relative au processeur. Les autres signaux et la structure de l'interface avec le 2650 seront vus plus tard. 6. SIGNAUX MEMOIRE Une mémoire est sélectionée par le signal ADMEM; si WRITE = 0, le contenu de la mémoire d'addresse sélectionée est lu !read! et apparaît sur le bus de données. Si WRITE = 1, l'état du bus de données est transféré dans la position mémoire dont l'adresse est sur le bus d'adresse. L'adresse doit naturellement correspondre à une adresse existante. La dimension de la mémoire est limitée et n'occupe qu'une partie des adresses possibles. Le schéma détaillé d'une mémoire de 128. mots de 8. bits compatible avec le DAUPHIN est donné dans la Fig. 3. Cette mémoire répond aux adresses 0 à 177 (octal): il est facile de vérifier que lorsque les adresses 2^7 à 2^11 sont 'a 0, la porte ET de sélection de circuit !CS: Chip Select! est à l'état 1. PAGE 6-------------------------------------------------------------------- [Fig. 2. Séquences de l'exécution du programme du paragraphe 4.] PAGE 7-------------------------------------------------------------------- [Fig. 3. Schéma détaillé d'une mémoire 6810.] 7. SIGNAUX ET INTERFACES Les périphériques sont sélectionnés par ADPER, en lecture ou en écriture selon la valeur de WRITE. Il existe des circuit spéciaux interface périphérique, mais pour les application simples, quelques circuits TTL de la série LS !Low Pocket Schottky! résolvent le problème à meilleures conditions. Par exemple l'interface haut-parleur compatible avec le programme précédent est donné dans la Fig. 4. Le décodeur d'addresse utilise un circuit 74LS138 et décode les addresses 64, 65, 66, 67 (octal naturellement) en lecture et en écriture. Seuls 6 bits d'adresse sont décodés, permettant ainsi un maximum de 64. périphériques, d'adresses 0 à 77. Si le périphérique 64 est sélectionné en écriture, le flip-flop reçoit à la fin de l'impulsion ADPER un flanc montant actif qui mémorise dans la bascule l'état de la ligne du bus correspondante (ligne de poids faible, donc valeur 1 ou 0 du mot binaire transféré par le bus). [Fig. 4. Interface haut-parleur compatible avec le programme du § 4.] 8. PROGRAMME ET INTERFACES SIMPLIFIES Le même problème peut se résoudre d'innombrables façons, tant du point de vue programmation !software! que du point de vue matériel !hardware!. Par exemple, le programme initalement donné peut s'écrire PAGE 8-------------------------------------------------------------------- [Listing] Le programme prend moins de place en mémoire cas les instructions CLR et INC n'ont pas de valeur numérique associée et sont plus courtes (8 bits). Ces deux instruction n'existent toutefois pas sous cette forme sur le 2650. L'inconvénient de ce nouveau programme est que le flip-flop de l'interface haut-parleur ne peut étre branché que sur le bit de poids faible. Une simplification plus grande du programme peut être obtenue avec l'interface de la Fig. 5, utilisé dans le DAUPHIN. [Fig. 5. Interface haut-parleur implémenté dans le DAUPHIN.] La sélection du périphérique 6 fait basculer un diviseur par deux, indépendamment du mot sur le bus de données, et aussie bien en lecture qu'en écriture. Le programme s'écrit alors: [Listing] 9. BOUCLES D'ATTENTE Les programmes OSCIL précédents fournissent des ultra-sons à vitesse nominale du processeur. Une instruction s'exécute en quelques microsecondes, et le programme ci-dessus donne une fréquence de 34. kHz. Pour réduire la fréquence, il faut insérer une boucle d'attente, faite avec un compteur qui décompte. Un 2e registre du processeur peut être utilitisé pour cela. Une instruction de saut conditionnel revient en arrière pour décompter le registre tant que le résultant n'est pas égal !NE: non equal! à zéro. [Listing] PAGE 9-------------------------------------------------------------------- Si l'on suppose, pour simplifier, que toute les instructions précédentes durent 5 µs, une demi-période dure 5+5+DELAY.(5+5)+5, soit 15+DELAY.10 µs. Pour obtenir un LA normal à 432 Hz, il faut donc fixer DELAY=115. (décimal). La valeur octale correspondante est 161 car 113. = 1.x64. + 6.x8. + 1. Tant que DELAY est inférieur à 377 = 255., il n'y a pas de problème. Pour des retards plus grands, il faut utiliser par exemple deux boucles de comptage imbriquées utilisant deux compteurs. Le programme ci-dessus est valable pour l'Intel 8080 et pour le Motorola 6800. Avec le Signetics 2650, une instruction unique remplace la décrémentation et la saut conditionnel. On peut donc écrire le programme suivant, donné avec son équivalent octal, prêt à être chargé et exécuté dans un DAUPHIN: [Listing] Remarquons tout de suite que ce programme peut être codé différemment, en utilisant le mode d'adressage relatif disponible dans le 2650 et expliqué dans la deuxième partie. [The rest of page 9, and pages 10..38] PAGE 39------------------------------------------------------------------- 23. INSTRUCTIONS SPECIALES D'ENTREE-SORTIE Quatre instructions ont été prévues dans le 2650 pour la sélection de 4 périphériques privilégiés, décodés à partir des bits d'adresse 2^13 et 2^14. Ces instructions n'ont pas d'application dans le DAUPHIN, qui n'incorpore pas les circuits de décodage permettant de tirer parti de ces instructions. Elle permettent toutefois de réaliser le programme de démonstration le plus simple du DAUPHIN: enlever la plaque mémoire, mettre sur ADFLOT (adresses libres), WRITE avec le mot 60 et sur RUN. Le processeur exécute l'instruction 60 (LOAD A,$CTRL), c'est-à-dire lit le périphérique dont l'adresse est dans le compteur d'adresses. Tous les périphériques sont sélectionnés et les lampes d'adresse clignotent. 24. INTERRUPTION Lors d'une demande d'interruption, par la ligne /INTREQ du processeur (actif à l'état 0), si le processeur a été mis dans l'état ION (interrupt on), il exécute à la fin de l'instruction en cours non pas l'instruction suivante, mais une instruction d'appel de sous-programme, le sous-programme étant appelé dans ce cas routine d'interruption. De façon interne, le code 273 (CALL 0+®') est forcé dans le registre d'instruction et le processeur lit sur le bus le second byte de cette instruction en générant une impulsion négative /INTACK !interrupt acknowledge!. Le périphérique demandant l'interruption est sensé reconnaître l'impulsion INTACK et placer sur le bus l'adresse de la routine d'interruption (ou l'adresse de la position qui contient l'adresse de cette routine si l'adrewsage indirect est utilisé), cette adresse se trouvant entre 0 et 77 ou 0 et -100 (1777700). La plaque 2650 DAUPHIN amène sur 2 douilles les signaux /INTREQ (IR) et /INTACK (IA) Pour des expériences on peut lier /INTREQ au OV pour faire une demande d'interruption, et lier /INTACK à la douille /WRITE se trouvant vers le commutateur WRITE (laisser ce commutateur sur DAFLOT). Lorsque /INTACK est actif, l'état des interrupteurs DATA est lu et il suffit d'y placer le vecteur d'interruption pour vérifier comment le processeur l'interprète. Au moment de l'interruption, le processeur se met automatiquement en IOF !interrupt off!. Lors du retour de la routine d'interruption, il faut en général resensibiliser le processeur aux interruptions. L'instruction RETION permet de simulanément revenir sur l'interruption et continuer le programme au point interròmpu et se remettre en ION. La gestion correcte des interruptions pose plusieurs problèmes délicats. En particulier, il ne faut pas oublier de sauver l'état de tous les registres utilisés par la routine d'interruption, y compris U et L, si l'on veut pouvoir continuer l'exécution correctement apreès le service d'interruption. Pour pallier certains points faibles de cette routine de sauvetage, Signetics a prévu d'ajouter de nouvelles instructions dans le 2650-B, qui sera à utiliser de préférence dans les applications avec interruption. L'expérience en programmation s'acquiert en grande partie en étudiant les programmes écrits par d'autres personnes. Ce ne sont pas toujours des modèles, car les personnes ayant becoup d'expérience sont rares, mais il y a tojours qulque bonne idée à reprendre. ELEclub, le journal des clubs d'électronique du GESO et de MICROCLUB (club des adeptes du microprocesseur), publie régulièrement des exemples de programmes pour DAPHIN, Pour s'abonner, s'adresser à Rédaction ELEclub, Rte de Prilly 3, 1008 Lausanne, Switzerland. Pour profiter également des exemples de programmes fournis par SIGNETICS (AS52: General Delay Routines; AS50 Input/Output; AS53: Binary Arithmetic routines; AS54: Conversion routines; Interrupt Save and Restore Routine using the 2650A; AS55 Fixed Point Decimal Arithmetic), la liste donnée en dernière page facilite la conversion. [Page 40] END OF DOCUMENT-----------------------------------------------------------