4/2 - Assembleur Z80 : Définitions et rappels de base4/2.3 - Les mots-clés de l'assembleur Z80 et leur utilisation I. Usage général et interruptions NOP : N° opération Indicateurs modifiés : aucun. Aucune action n'est effectuée, si ce n'est une perte de temps pour analyser le code et l'exécuter. Applications : C'est une instruction idéale pour créer des temporisations. Sachant qu'une instruction NOP prend 1 cycle machine (voir table en annexe) et que, sur AMSTRAD, un cycle machine prend 0,25 microsecondes, un NOP est donc exécuté en 0.25 microsecondes. Nous pourrons réaliser des temporisations de courte durée en mettant à la suite plusieurs NOP. 1 ; ORG 9000H 2 ; LOAD 9000H 3 9000 00 ;NOP ;0.25 microsec passées 4 9001 00 ;NOP ;0.25 microsec passées 5 9002 00 ;NOP ;0.25 microsec passées 6 ; ENDPour réaliser des temporisations plus longues, nous pourrons insérer une ou plusieurs instruction(s) NOP dans une boucle.Reportez-vous à la description de l'ordre DJNZ si vous ne connaissez pas son utilisation (voir partie 4 chapitre 2.3 p. 32). LD B,0 prend 2 cycles donc 0.5 microsecondes. DJNZ prend 2 cycles donc 0.5 microsecondes. 
1 ; ORG 9000H 2 ; LOAD 9000H 3 9000 0600 LD B,0 ; Nombre de boucles 4 ; BOUCLE: EQU $ 5 9002 00 ; NOP ; histoire de passer le temps 6 9003 10FD DJNZ BOUCLE 7 ; ENDLa temporisation fera :LD B,0 ; &FF * (NOP + DJNZ) 2 cycles + &FF*(1 +2) cycles = 767 cycles soit 383.5 microsecondes.Pour réaliser des temporisations encore plus longues, nous pourrons imbriquer deux ou plus de deux boucles de la façon suivante : 1 ; ORG 9000H 2 ; LOAD 9000H 3 9000 0E00 LD C,0 ; Nombre de boucles *FF 4 ; B1: EQU $ 5 9002 0600 LD B,0 ; Nombre de boucles 6 ; B2: EQU $ 7 9004 00 NOP ; Attente 8 9005 10FD DJNZ B2 ; 1er boucle 9 9007 0D DEC C ; C = C-1 10 9008 20F8 JR NZ,B1 ; 2eme boucle 11 ; ENDLa temporisation fera :LD C,0 ;&FF* (LD B,0 + &FF*(NOP + DJNZ) + DEC C + JP NZ,@) 2 + &FF*(2 + &FF*(1+2) + 1+3)19 607 cycles, soit 98.3 millisecondes, soit environ 0,1 sec.HALT Indicateurs modifiés : aucun. Arrête le déroulement du programme qui ne pourra être relancé que par une action matérielle (interruption ou RESET). Remarque : Les RAM dynamiques ne sont plus rafraîchies suite à l'exécution de cet ordre, et les informations qu'elles contiennent peuvent être perdues. INTERRUPTIONS - Avant de voir la fonction des ordres dédiés aux interruptions, nous allons définir ce qu'est une interruption. Pour mieux cerner le problème, nous pouvons faire un parallèle avec une situation similaire mais peut-être plus courante pour vous.
Supposez que vous êtes en train de lire un livre, et que le téléphone se met à sonner. Vous pouvez réagir de trois manières différentes :- vous pouvez ignorer le téléphone et continuer votre lecture ;
- vous pouvez finir ta phrase que vous êtes en train de lire, puis décrocher le téléphone ;
- vous pouvez arrêter immédiatement votre lecture et décrocher le téléphone.
Dans le deuxième et le troisième cas, vous reprendrez sans doute la lecture du livre quand la conversation téléphonique sera finie.Dans un ordinateur, les interruptions sont interprétées par le microprocesseur de la même manière que la sonnerie du téléphone dans l'exemple ci-dessus, et la lecture du livre correspond à l'exécution d'un programme. Si le programme est ininterruptible (cas N° 1 de notre exemple), l'interruption ne sera pas prise en compte et le programme continuera son exécution sans aucun arrêt. Si le programme est interruptible, selon la priorité de l'interruption, il sera interrompu immédiatement (cas n° 3 de notre exemple), ou après un certain temps (cas n° 2 de notre exemple) – Voir page suivante –. - Nous savons ce qu'est une interruption, mais pas encore ce qui peut la provoquer.
En général, tous les périphériques de l'ordinateur peuvent émettre des interruptions dès qu'ils ont besoin :- de la puisance de calcul du microprocesseur,
- d'accéder à la mémoire,
- de communiquer avec un autre périphérique.

Deux méthodes peuvent cependant être employées par le microprocesseur pour savoir si un périphérique a besoin de lui. Première méthode : Intervention dans l'Idle Loop Quand il n'a « rien de spécial à faire », le microprocesseur exécute une série d'instructions qui servent à rafraîchir la RAM, ou à tester si un périphérique sollicite sa présence. Cette série d'instructions porte le nom d'« Idle Loop » ou boucle d'attente principale. Le test d'activation du clavier pourra être fait dans l'Idle Loop de la manière suivante : 
Deuxième méthode : Attente d'une interruption Le microprocesseur se trouve soit dans l'Idle Loop, soit en train d'exécuter un programme. L'équipement qui requiert le microprocesseur émet une interruption. Reprenons l'exemple du clavier. Quand une touche est pressée, une interruption est générée, et selon l'importance (appelée « priorité ») du programme en cours d'exécution, l'appui sur la touche sera pris en compte immédiatement, sous un certain délai, ou pas du tout (par exemple, lors de l'accès au lecteur de cassettes ou de disquettes}. - Avant de passer à l'utilisation des ordres d'interruptions, il reste à définir les divers types d'interruptions que peut gérer le Z80.
Quatre pattes du circuit intégré Z80 sont dédiées aux interruptions. Il s'agit de NMI, INT, BUSRQ et RESET. Quand le niveau de tension passe de 5 volts à 0 volt ou quand un niveau 0 volt est détecté sur l'une de ces pattes, une interruption est générée.Interruptions non masquables : Ces interruptions sont prises en compte immédiatement (à la fin du cycle d'instructions en cours), quel que soit le programme en cours d'exécution. Il s'agit des interruptions NMI. Les actions suivantes se produisent : - empilement du PC (Program Counter = Pointeur d'adresse de l'instruction en cours d'exécution) ;
- sauvegarde de l'état de masquage d'interruption (IFF : c'est l'information qui indique si le programme en cours d'exécution est ou n'est pas interruptible) ;
- interdiction de prise en compte d'autres interruptions pendant le traitement de l'interruption NMI par action sur l'information de masquage d'interruption IFF ;
- exécution déprogramme d'interruption situé en &0066.
La fin d'interruption non masquable est repérée par l'ordre RETN qui permettra de revenir à l'état de masquage d'interruption précédant l'acti-vation de la routine d'interruption NMI.Remarque : Si l'instruction RET est rencontrée, la routine de traitement d'interruption sera considérée comme finie, et le masque d'interruption ne sera pas restauré Interruptions masquables : La prise en compte des interruptions de type INT peut être masquée (Dl : Disable Interrupts) ou autorisée (EI : Enable Interrupts) par programme. Contrairement à la patte NMI qui provoque une interruption sur front descendant (5 V -* 0 V), la patte INT provoquera une interruption sur niveau bas. La tension sur cette patte devra être 0 voit jusqu'à ce que le Z80 décide de la traiter, et devra être mise à 5 volts quand l'interruption aura été traitée. Sinon, une autre interruption sera générée. EI : Enable Interrupts Cette instruction permet de valider la prise en compte des interruptions masquables de type INT. DI : Disable Interrupts Cette instruction permet de dévalider la prise en compte des interrup-. tions masquables de type INT. IM 0 : Interrupt Mode 0 Permet de valider le mode d'interruption 0. Ce mode est actif à la mise sous tension du microprocesseur, quand une commande de remise à zéro du Z80 est émise, ou quand l'ordre IM 0 est rencontré. Si la demande d'interruption (IT) est acceptée (IT validées par EI et aucune interruption en cours) : - les demandes d'interruptions sont inhibées et l'état de masquage des interruptions est écrasé (IFF = 0),
- les pattes M1 et IORQ sont mises à 0. Ce qui provoque l'émission vers le Z80 d'un code opératoire de type « RST 0 » à « RST 7 » ou « CALL Adresse »,
- le Z80 saute à l'emplacement correspondant à l'ordre ReSTart qu'il a reçu,
RST Adresse du ;débranchement ----------------------------- 0 ;&0000 1 ;&O008 2 ;&0010 3 ;&0018 4 ;&0020 5 ;&0028 6 ;&0030 7 ;&0038Ou à l'adresse spécifiée dans les deux octets (poids faible, poids fort} qui suivent le code opératoire CALL. IM 1 : Interrupt Mode 1 Permet de valider le mode d'interruption 1. Si la demande d'IT est acceptée (IT validées par EI et aucune interruption en cours) : - les demandes d'interruptions sont inhibées et l'état de masquage des interruptions est écrasé (IFF = 0),
- le PC est stocké dans la pile,
- le Z80 exécute la routine d'interruption située en &0038.
La routine d'interruption doit se terminer par l'instruction RET ou RETI.IM 2 : Interrupt Mode 2 Permet de valider le mode d'interruption 2. Ce mode est actif quand l'ordre IM 2 est rencontré. Si la demande d'IT est acceptée (IT validées par El et aucune interruption en cours) : - les demandes d'interruptions sont inhibées et l'état de masquage des interruptions est écrasé (IFF = 0),
- les pattes M1 et IORQ sont mises à 0. Ce qui provoque l'émission d'un octet sur le bus de données. Le Z80 forme un mot de 16 bits où les 8 bits de poids fort sont constitués par le registre I, et les 8 bits de poids faible par l'octet émis sur le bus de données.
Le contenu de l'adresse constituée parle mot de 16 bits précédent donne l'adresse à laquelle se trouve le programme de gestion d'interruptions.Ce mode d'indirections pour trouver l'adresse d'exécution de la routine d'IT peut sembler complexe, mais il a l'avantage de permetre d'exécuter une routine située à un endroit quelconque en mémoire.
CPCrulez[Content Management System] v8.732-desktop/c Page créée en 416 millisecondes et consultée 1816 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|