Gestion des interruptions
Types d'interruptions
Le 6502 possède trois types d'interruptions, plus le signal de réinitialisation (RESET). Contrairement au 68000 (256 vecteurs) ou au 80386 (256 entrées dans l'IDT), le 6502 ne dispose que de trois vecteurs fixes en fin de mémoire.
Les quatre événements interrompant le flux normal d'exécution :
| Événement | Type | Masquable | Vecteur | Priorité |
|---|---|---|---|---|
| RESET | Réinitialisé | Non | $FFFC-$FFFD | 1 (max) |
| NMI | Materielle | Non | $FFFA-$FFFB | 2 |
| IRQ | Materielle | Oui (I=1) | $FFFE-$FFFF | 3 |
| BRK | Logicielle | Oui (I=1) | $FFFE-$FFFF | 4 (minimum) |
Points clefs :
- IRQ et BRK partagent le même vecteur ($FFFE-$FFFF)
- Le drapeau B du registre P permet de les distinguer
- NMI ne peut pas être masquée par le drapeau I
- RESET n'est pas une interruption a proprement parler : il réinitialise le processeur sans sauvegarder de contexte
- Le 6502 n'a pas de mode superviseur/utilisateur (contrairement au 68000 et au 80386)
Comparaison avec d'autres microprocesseurs :
| Microprocesseur | Vecteurs | Masquage | Priorités |
|---|---|---|---|
| MOS 6502 | 3 fixes | 1 bit (I) | Fixe : RESET > NMI > IRQ |
| Zilog Z80 | 3 modes | EI/DI | 3 modes (0,1,2) |
| Intel 8080 | 8 (RST) | EI/DI | Fixe |
| Motorola 6800 | 3 fixes | 1 bit (I) | Fixe : RESET > NMI > IRQ |
| Motorola 6809 | 7 vecteurs | 2 bits (I,F) | RESET > NMI > FIRQ > IRQ > SWI |
| Motorola 68000 | 256 | 3 bits IPL | 7 niveaux + NMI |
| Intel 80386 | 256 (IDT) | IF + PIC | Programmable via PIC |
Interruption matérielle (IRQ)
L'IRQ (Interrupt Request) est le mécanisme d'interruption principal du 6502. La ligne IRQ est active a l'état bas (active low) et sensible au niveau (level-triggered).
Caractéristiques de la ligne IRQ
| Caractéristique | Description |
|---|---|
| Signal | Actif a l'état bas (0 = demande d'interruption) |
| Type | Sensible au niveau (level-triggered) |
| Masquable | Oui, par le drapeau I du registre P |
| Vecteur | $FFFE-$FFFF |
| Latence | 7 cycles minimum |
La ligne IRQ est généralement un bus a collecteur ouvert (open collector / open drain), ce qui permet a plusieurs périphériques de partager la même ligne. Quand un périphérique veut interrompre le processeur, il tire la ligne IRQ a l'état bas. La ligne remonte a l'état haut (via une résistance de rappel) quand tous les périphériques ont relâché la ligne.
Sensibilité au niveau
Puisque la ligne IRQ est sensible au NIVEAU (et non au front), le microprocesseur continue de détecter une demande d'interruption tant que la ligne reste à l'état bas. Cela implique :
- Le périphérique doit relâcher la ligne IRQ dans le descripteur (en lisant un registre d'état ou en écrivant un accusé de réception)
- Si la ligne est encore basse après RTI, une nouvelle interruption sera déclenchée immédiatement
- Plusieurs périphériques peuvent partager la même ligne (le descripteur doit interroger chaque périphérique)
Exemple de partage IRQ sur le Commodore 64 :
- IRQ_Handler:
- ; Verifier quel peripherique a cause l'interruption
- LDA $D019 ; registre d'etat des interruptions du VIC-II
- BMI VIC_IRQ ; bit 7 = 1 si le VIC-II a cause l'IRQ
- LDA $DC0D ; registre d'etat du CIA #1
- BMI CIA1_IRQ ; bit 7 = 1 si le CIA #1 a cause l'IRQ
- LDA $DD0D ; registre d'etat du CIA #2
- BMI CIA2_IRQ ; bit 7 = 1 si le CIA #2 a cause l'IRQ
- JMP Fin_IRQ ; pas d'interruption identifiee (spurious)
-
- VIC_IRQ:
- STA $D019 ; acquitter l'interruption du VIC-II
- ; ... traiter l'interruption VIC-II ...
- JMP Fin_IRQ
-
- CIA1_IRQ:
- ; (la lecture de $DC0D acquitte automatiquement)
- ; ... traiter l'interruption CIA #1 ...
- JMP Fin_IRQ
-
- CIA2_IRQ:
- ; (la lecture de $DD0D acquitte automatiquement)
- ; ... traiter l'interruption CIA #2 ...
-
- Fin_IRQ:
- PLA ; restaurer A (si empile au debut)
- TAX ; etc.
- RTI
Masquage des IRQ
Le drapeau I (Interrupt Disable) du registre P contrôle si les interruptions IRQ sont acceptées :
- I = 0 : IRQ est autorisée (les interruptions sont traitées)
- I = 1 : IRQ est masquée (les interruptions sont ignorées)
Instructions pour contrôler le masquage :
- SEI ; I := 1 (masquer les IRQ)
- CLI ; I := 0 (autoriser les IRQ)
Lors du traitement d'une interruption (IRQ ou NMI), le processeur met automatiquement I a 1 pour empêcher les interruptions imbriquées. Le programmeur peut re-autoriser les interruptions dans le descripteur avec CLI si les interruptions imbriquées sont désirées.
Séquence typique de section critique :
Sources d'IRQ typiques par machine
- CIA #1 ($DC00) : minuterie A/B, clavier, port série
- CIA #2 ($DD00) : minuterie A/B, port série, NMI via RESTORE (le CIA #2 génère aussi des NMI)
- VIC-II ($D000) : raster, collision sprites, lightpen
Apple II :
- Peu d'IRQ utilisées en standard
- Cartes d'extension : horloge, port série
- ProDOS utilise un mécanisme d'interruption pour les périphériques
NES (Nintendo) :
- APU (Audio Processing Unit) : fin de trame audio
- Cartographie de cartouche : compteur de lignes de balayage (certains cartographies comme le MMC3)
- Le RIOT (6532) genere des interruptions minuterie
- En pratique, le 2600 utilise peu les IRQ car le programme est synchronise avec le balayage vidéo
Interruption non masquable (NMI)
La NMI (Non-Maskable Interrupt) est une interruption qui ne peut PAS être masquée par le drapeau I. Elle est prioritaire sur l'IRQ.
Caractéristiques de la ligne NMI
| Caractéristique | Description |
|---|---|
| Signal | Actif sur front descendant (edge-triggered) |
| Type | Sensible au front (falling edge) |
| Masquable | Non (le drapeau I est ignore) |
| Vecteur | $FFFA-$FFFB |
| Latence | 7 cycles minimum |
Différence cruciale avec l'IRQ : la NMI est détectée sur le FRONT descendant (passage de haut a bas), et non sur le niveau. Cela signifie :
- Une seule interruption est générée par transition
- Pas besoin d'acquitter la NMI dans le descripteur
- La ligne doit revenir a l'état haut avant qu'une nouvelle NMI puisse être déclenchée
- Un signal NMI maintenu en permanence à l'état bas ne déclenche qu'une seule interruption
Détection du front descendant
Le 6502 échantillonne la ligne NMI a chaque cycle d'horloge.
Le front descendant est détecté quand :
- L'échantillon précédent était à l'état haut (1)
- L'échantillon courant est a l'état bas (0)
Cette détection par front a des conséquences importantes :
- Si la NMI est active pendant le traitement d'une NMI précédente et que la ligne n'est pas revenue à l'état haut entre-temps, la deuxième NMI sera perdue
- La NMI peut interrompre un descripteur d'IRQ
- La NMI peut même interrompre le début du traitement d'une IRQ
Sources de NMI typiques par machine
- CIA #2 : touche RESTORE sur le clavier
- En pratique, la NMI est peu utilisée sur le C64 en dehors de la touche RESTORE
NES (Nintendo) :
- VBlank (retour vertical) : le PPU génère une NMI a chaque début de retour vertical (ligne 241)
- C'est le mécanisme principal de synchronisation du programme avec l'affichage
- Contrôlée par le bit 7 du registre PPUCTRL ($2000)
Apple II :
- Pas de source NMI standard
- Certaines cartes d'extension utilisent la NMI
Atari 800/XL/XE :
- ANTIC : le co-processeur vidéo génère des NMI pour les Display List Interrupts (DLI) et le VBI (Vertical Blank Interrupt)
Exemple : descripteur NMI sur la NES
- NMI_Handler:
- PHA ; sauvegarder A
- TXA
- PHA ; sauvegarder X
- TYA
- PHA ; sauvegarder Y
-
- ; Lire le registre d'etat du PPU pour acquitter la NMI
- LDA $2002 ; PPUSTATUS - aussi remet le latch d'adresse
-
- ; Effectuer les mises a jour graphiques pendant le VBlank
- ; (ecriture OAM, mise a jour de la nametable, etc.)
- LDA #$00
- STA $2003 ; OAMADDR = 0
- LDA #$02
- STA $4014 ; DMA OAM depuis la page $0200
-
- ; Mettre a jour le defilement
- LDA scroll_x
- STA $2005 ; defilement horizontal
- LDA scroll_y
- STA $2005 ; defilement vertical
-
- ; Restaurer les registres
- PLA
- TAY ; restaurer Y
- PLA
- TAX ; restaurer X
- PLA ; restaurer A
- RTI
Interruption logicielle (BRK)
L'instruction BRK déclenche une interruption logicielle. C'est l'équivalent du TRAP du 68000 ou de l'INT du 80386.
Comportement de BRK
| Caractéristique | Description |
|---|---|
| Opcode | $00 |
| Taille | 1 octet (mais consomme 2 octets) |
| Cycles | 7 |
| Vecteur | $FFFE-$FFFF (même vecteur que IRQ) |
| Drapeau B | Mis a 1 dans la copie empilée de P |
Séquence d'exécution de BRK :
- 1. PC := PC + 2 (saute l'opcode ET l'octet suivant)
- 2. Empiler PCH sur la pile (octet haut de PC)
- 3. Empiler PCL sur la pile (octet bas de PC)
- 4. Mettre le drapeau B a 1
- 5. Empiler P sur la pile (avec B=1)
- 6. Mettre le drapeau I a 1 (masquer les IRQ)
- 7. PCL := [$FFFE]
- 8. PCH := [$FFFF]
L'octet signature (padding byte)
BRK avance le PC de 2 (et non de 1), ce qui fait que l'octet immédiatement après BRK est saute. Cet octet est appelé "signature byte" ou "padding byte" et peut etre utilise pour transmettre une information au descripteur :
- BRK
- .BYTE $01 ; signature : code de la fonction demandee
Dans le descripteur, pour récupérer la signature :
- ; Le PC empile pointe sur l'octet APRES la signature
- ; Donc PC_empile - 1 = adresse de la signature
- Handler_BRK:
- PLA ; recuperer P depuis la pile
- PHA ; le remettre
- TSX ; X := SP
- LDA $0102,X ; lire PCL depuis la pile (SP+2)
- SEC
- SBC #$01 ; PCL - 1
- STA ptr_low
- LDA $0103,X ; lire PCH depuis la pile (SP+3)
- SBC #$00 ; propager le borrow
- STA ptr_high
- ; (ptr_low, ptr_high) pointe maintenant sur la signature
- LDY #$00
- LDA (ptr_low),Y ; lire la signature
- ; Dispatcher selon la valeur de la signature...
Distinction BRK / IRQ
Puisque BRK et IRQ partagent le même vecteur ($FFFE-$FFFF), le descripteur doit les distinguer en examinant le drapeau B dans la copie de P empilée sur la pile :
- B = 1 : c'est un BRK (interruption logicielle)
- B = 0 : c'est une IRQ (interruption matérielle)
Le drapeau B n'existe pas physiquement dans le registre P ; il n'est présent que dans la copie empilée.
Code typique de distinction :
- IRQ_BRK_Handler:
- PHA ; sauvegarder A
- TXA
- PHA ; sauvegarder X
- TYA
- PHA ; sauvegarder Y
-
- TSX ; X := SP
- LDA $0104,X ; lire la copie de P depuis la pile
- ; (offset 4 car on a empile 3 registres)
- AND #$10 ; tester le bit B (bit 4)
- BNE Est_BRK ; si B=1, c'est un BRK
-
- Est_IRQ:
- ; ... traiter l'IRQ ...
- JMP Fin_Handler
-
- Est_BRK:
- ; ... traiter le BRK ...
-
- Fin_Handler:
- PLA
- TAY ; restaurer Y
- PLA
- TAX ; restaurer X
- PLA ; restaurer A
- RTI
Utilisations de BRK
- Points d'arrêt pour le débogage (breakpoints) : un debugger remplace temporairement un opcode par $00 (BRK) pour arrêter l'exécution a cet endroit
- Appels système (system calls) : sur certains systèmes, BRK + signature est utilise comme mécanisme d'appel au moniteur ou au système d'exploitation
- Trap pour gestion d'erreurs : similaire au TRAP du 68000
Bug connu : BRK + IRQ simultanée
Si une IRQ se produit exactement au même moment qu'un BRK, le comportement du 6502 NMOS est le suivant :
- Le BRK est "avale" : le descripteur reçoit une IRQ normale (le drapeau B est a 0 dans la copie empilée)
- Le PC empile pointe 2 octets après le BRK
- Au retour du descripteur par RTI, l'octet signature est saute mais le BRK n'a pas été traité
Ce bug est corrigé sur le 65C02 (CMOS).
Vecteurs d'interruption
Les vecteurs d'interruption sont situés aux six derniers octets de l'espace d'adressage, dans la page $FFxx :
| Adresse | Contenu | Événement |
|---|---|---|
| $FFFA | NMI vector (low byte) | Interruption NMI |
| $FFFB | NMI vector (high byte) | |
| $FFFC | RESET vector (low) | Réinitialisation |
| $FFFD | RESET vector (high) | |
| $FFFE | IRQ/BRK vector (low) | Interruption IRQ ou BRK |
| $FFFF | IRQ/BRK vector (high) |
Chaque vecteur est une adresse 16 bits entreposée en format little-endian (octet de poids faible d'abord).
Placement des vecteurs en mémoire
Sur la plupart des systèmes, les vecteurs se trouvent en ROM (mémoire morte) car ils doivent être disponibles au démarrage avant toute initialisation du système.
Les valeurs typiques des vecteurs par machine :
Commodore 64 (ROM KERNAL) :
| Adresse | Description |
|---|---|
| $FFFA-$FFFB | $FE43 (NMI → routine KERNAL NMI) |
| $FFFC-$FFFD | $FCE2 (RESET → initialisation système) |
| $FFFE-$FFFF | $FF48 (IRQ/BRK → routine KERNAL IRQ) |
Apple II :
| Adresse | Description |
|---|---|
| $FFFA-$FFFB | $0000 (NMI - pas utilise en standard) |
| $FFFC-$FFFD | Varie selon la ROM |
| $FFFE-$FFFF | Pointe vers le descripteur dans le moniteur |
NES (Nintendo) :
Les vecteurs sont dans la ROM de la cartouche. Chaque ensemble définit ses propres vecteurs.
Exemple typique (assembleur) :
- .ORG $FFFA
- .WORD NMI_Handler ; adresse du descripteur NMI
- .WORD RESET_Handler ; adresse du descripteur RESET
- .WORD IRQ_Handler ; adresse du descripteur IRQ/BRK
| Adresse | Description |
|---|---|
| $FFFA-$FFFB | Adresse du descripteur NMI (pas utilise) |
| $FFFC-$FFFD | Adresse du point d'entrée du programme |
| $FFFE-$FFFF | Adresse du descripteur IRQ/BRK |
Redirection des vecteurs (vectoring par RAM)
Puisque les vecteurs sont en ROM, il est impossible de les modifier directement. La plupart des systèmes utilisent un mécanisme de redirection par RAM : le descripteur en ROM lit une adresse en RAM et saute a cette adresse avec un JMP indirect.
Exemple sur le Commodore 64 :
Le descripteur IRQ en ROM ($FF48) fait :
Les vecteurs RAM du C64 sont :
| Adresse | Description |
|---|---|
| $0314-$0315 | Vecteur IRQ (defaut = $EA31, routine KERNAL) |
| $0316-$0317 | Vecteur BRK (defaut = $FE66, routine KERNAL) |
| $0318-$0319 | Vecteur NMI (defaut = $FE47, routine KERNAL) |
Pour installer un descripteur IRQ personnalisé :
Séquence de traitement d'une interruption
Séquence IRQ (7 cycles)
Quand le processeur détecte une demande IRQ et que I=0 :
| Cycle | Action |
|---|---|
| 1 | Lecture de l'opcode a PC (instruction interrompue est terminée avant de traiter l'IRQ) |
| 2 | Lecture de l'octet suivant (ignore) |
| 3 | Empiler PCH a l'adresse $0100+SP, SP := SP-1 |
| 4 | Empiler PCL a l'adresse $0100+SP, SP := SP-1 |
| 5 | Empiler P a l'adresse $0100+SP (avec B=0), SP := SP-1, mettre I := 1 |
| 6 | Lire PCL := [$FFFE] |
| 7 | Lire PCH := [$FFFF] |
État de la pile après le traitement :
| Adresse | Contenu |
|---|---|
| $0100+SP+3 | PCH (octet haut de l'adresse de retour) |
| $0100+SP+2 | PCL (octet bas de l'adresse de retour) |
| $0100+SP+1 | P (registre d'état, avec B=0 pour IRQ) |
Le PC empile pointe sur l'instruction qui aurait été exécutée si l'interruption n'avait pas eu lieu.
Séquence NMI (7 cycles)
La séquence NMI est identique a celle de l'IRQ, sauf :
- Elle n'est pas affectée par le drapeau I
- Elle lit le vecteur a $FFFA-$FFFB au lieu de $FFFE-$FFFF
- Le drapeau B empile est a 0
| Cycle | Action |
|---|---|
| 1 | Lecture de l'opcode a PC (ignore) |
| 2 | Lecture de l'octet suivant (ignore) |
| 3 | Empiler PCH a l'adresse $0100+SP, SP := SP-1 |
| 4 | Empiler PCL a l'adresse $0100+SP, SP := SP-1 |
| 5 | Empiler P a l'adresse $0100+SP (avec B=0), SP := SP-1, mettre I := 1 |
| 6 | Lire PCL := [$FFFA] |
| 7 | Lire PCH := [$FFFB] |
Séquence BRK (7 cycles)
La séquence BRK est similaire a celle de l'IRQ, mais :
- PC est incrémenté de 2 (saute l'opcode + signature)
- Le drapeau B empile est a 1
| Cycle | Action |
|---|---|
| 1 | Lecture de l'opcode ($00) a PC |
| 2 | Lecture de l'octet suivant (signature), PC := PC+2 |
| 3 | Empiler PCH a l'adresse $0100+SP, SP := SP-1 |
| 4 | Empiler PCL a l'adresse $0100+SP, SP := SP-1 |
| 5 | Empiler P a l'adresse $0100+SP (avec B=1), SP := SP-1, mettre I := 1 |
| 6 | Lire PCL := [$FFFE] |
| 7 | Lire PCH := [$FFFF] |
Séquence RESET
Le RESET est différent des autres interruptions : il ne sauvegarde pas de contexte sur la pile. Il réinitialise le microprocesseur a un état connu.
| Cycle | Action |
|---|---|
| 1-6 | Le microprocesseur effectue des cycles internes (similaires a une interruption mais les écritures sur la pile sont transformées en lectures) SP := SP - 3 (le pointeur de pile est décrementé mais rien n'est écrit) |
| 7 | Mettre I := 1 (masquer les IRQ) Mettre D := 0 (désactiver le mode décimal sur 65C02) |
| 8 | Lire PCL := [$FFFC] |
| 9 | Lire PCH := [$FFFD] |
État du processeur après RESET :
- A, X, Y : inchangés (contenu aléatoire au premier RESET)
- SP : décrémenté de 3 (mais pas de données écrites)
- P : I=1, les autres bits sont indéterminés (sur le 65C02 : D est remis a 0)
- PC : charge depuis le vecteur $FFFC-$FFFD
Note : le RESET ne réinitialise PAS les registres A, X, Y ni le contenu de la RAM. Seuls le PC (charge depuis le vecteur), le drapeau I (mis a 1) et le SP (décrémenté) sont affectés. Le code d'initialisation au vecteur RESET doit initialiser explicitement tous les registres et la mémoire.
Code typique d'initialisation au RESET :
- RESET_Handler:
- SEI ; masquer les IRQ (deja fait par le RESET
- ; mais par securite)
- CLD ; desactiver le mode decimal
- LDX #$FF
- TXS ; initialiser le pointeur de pile a $FF
-
- ; Initialiser la RAM a zero
- LDA #$00
- TAX
- Clear_RAM:
- STA $0000,X
- STA $0100,X
- STA $0200,X
- STA $0300,X
- STA $0400,X
- STA $0500,X
- STA $0600,X
- STA $0700,X
- INX
- BNE Clear_RAM
-
- ; Initialiser le materiel
- ; ... (depend du systeme) ...
-
- CLI ; autoriser les IRQ
- JMP Main ; sauter au programme principal
Séquence RTI (6 cycles)
L'instruction RTI (Return from Interrupt) restaure le contexte sauvegarde et reprend l'exécution interrompue :
| Cycle | Action |
|---|---|
| 1 | Lecture de l'opcode ($40) a PC |
| 2 | Lecture de l'octet suivant (ignore) |
| 3 | SP := SP + 1 (ajuster SP) |
| 4 | Lire P := [$0100+SP], SP := SP + 1 |
| 5 | Lire PCL := [$0100+SP], SP := SP + 1 |
| 6 | Lire PCH := [$0100+SP] |
Notes importantes :
- RTI restaure le registre P complet, y compris le drapeau I. Si le descripteur a modifie I (par exemple avec CLI pour permettre les interruptions imbriquées), la valeur originale de I est restaurée par RTI.
- Contrairement a RTS, RTI ne fait PAS PC := PC + 1 après la restauration. L'adresse empilée est exacte.
- RTI restaure aussi le drapeau D. Si le descripteur utilise le mode décimal, le CLD dans le descripteur n'affecte pas le programme interrompu.
Comparaison RTI vs RTS :
| Instruction | Registres restaures | PC après retour |
|---|---|---|
| RTI | P, PCL, PCH | Valeur exacte empilée |
| RTS | PCL, PCH | Valeur empilée + 1 |
La différence de PC s'explique par le fait que JSR empile PC-1 (dernière adresse de l'instruction JSR), tandis que les interruptions empilent l'adresse exacte de la prochaine instruction a exécuter.
Cas limites et interactions
Plusieurs situations peuvent créer des comportements subtils :
NMI pendant le traitement d'une IRQ :
- Si une NMI arrive pendant que le processeur empile le contexte d'une IRQ, la NMI est mise en attente et sera traitée après l'IRQ. Le processeur ne peut pas être interrompu au milieu d'une séquence d'empilement. Cependant, une fois le descripteur IRQ en cours d'exécution, une NMI peut l'interrompre normalement.
IRQ pendant le traitement d'une NMI :
- Le descripteur NMI commence avec I=1 (IRQ masquées). Si le descripteur ne fait pas CLI, les IRQ sont masquées pendant toute la durée de la NMI. RTI restaure l'ancien P, ce qui re-autorise les IRQ si elles étaient autorisées avant la NMI.
NMI qui hijack le vecteur IRQ/BRK :
- Bug du 6502 NMOS : si une NMI arrive pendant les cycles 6-7 d'une séquence IRQ/BRK (lecture du vecteur), le processeur peut lire un octet du vecteur IRQ et un octet du vecteur NMI, résultant en une adresse incorrecte. Ce bug est corrige sur le 65C02.
Double NMI :
- Si la ligne NMI revient a l'état haut puis redescend pendant le traitement d'une NMI, une deuxième NMI sera mise en attente. Elle sera traitée après le RTI de la première NMI.
Résumé du comportement de la pile
État de la pile dans chaque cas :
| Cas | Description |
|---|---|
| Avant l'interruption | SP pointe sur la dernière donnée empilée (ou sur $FF si la pile est vide) |
Pendant une interruption : 3 octets sont empiles
|
$0100 + SP_ancien → PCH $0100 + SP_ancien - 1 → PCL $0100 + SP_ancien - 2 → P (avec B=0 pour IRQ/NMI, B=1 pour BRK) SP := SP_ancien - 3 |
Après RTI : 3 octets sont depiles :
|
P := [$0100 + SP + 1] PCL := [$0100 + SP + 2] PCH := [$0100 + SP + 3] SP := SP + 3 |
Diagramme temporel des interruptions
Ligne de temps typique pour une IRQ :
| Horloge : | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| PC | cur | cur+1 | - | - | - | lo | hi |
| Action | fetch | fetch | push | push | push | read | read |
| op | op | PCH | PCL | P | $FFFE | $FFFF | |
| SP | SP | SP | SP-1 | SP-2 | SP-3 | SP-3 | SP-3 |
| Drapeaux | I:=1 |
Après le cycle 7, le processeur commence a exécuter l'instruction a l'adresse lue depuis le vecteur.
Comparaison avec d'autres microprocesseurs
| Microprocesseur | Contexte sauvegarde | Cycles | Pile |
|---|---|---|---|
| MOS 6502 | P, PCL, PCH (3 octets) | 7 | $0100-$01FF |
| Zilog Z80 | PC (2 octets) | ~13 | Quelconque |
| Intel 8080 | PC (2 octets) | ~11 | Quelconque |
| Motorola 6800 | PC,X,A,B,CC (7 octets) | 12 | Quelconque |
| Motorola 6809 | Tous registres (12 oct) | 19 | Quelconque |
| Motorola 68000 | SR, PC (6 octets min) | ~44 | Superviseur |
| Intel 80386 | EFLAGS, CS, EIP (+err) | Variable | TSS/pile |
Le 6502 sauvegarde le minimum sur la pile (seulement P et PC), ce qui rend l'entrée en interruption rapide (7 cycles) mais oblige le descripteur a sauvegarder manuellement A, X et Y si nécessaire. Le 6809, en revanche, sauvegarde automatiquement tous les registres (12 octets) mais au prix de 19 cycles.