Liste
des instructions du 6502
- A : Registre Accumulateur.
- X : Registre X.
- Y : Registre Y.
- C : Registre Carry, retenue.
- d ou dd : une valeur donnée sur 8 bits.
- M: La valeur en provenance d'une adresse mémoire
- aa : Adresse en page zéro (sur 8 bits)
- aaaa : Adresse sur 16 bits
Les instructions sont classées par ordre alphabétique :
Remarque, le nombre de cycle peut changer pour certaines instructions de +1 à +2 si la mémoire à accéder est sur une autre page (partie haute de l'adresse).
Additionner la donnée et Carry avec l'accumulateur, avec affectation dans l'accumulateur et maj de Carry. Le fait de positionner le flag carry permettant de faire des additions sur 16 bits. Il suffit pour cela de refaire un ADC juste après.
Opération effectuée :
A + d + C affecte A et C
Flags modifiés :
N = 1 si le bit 7 est positionné, Z = 1 si A = 0, C = 1 si nombre > 8 bits, V = 1 si le bit 7, qui représente le signe devient incorrect
Instructions |
Opcode |
Nb. cycle |
ADC #dd |
69 |
2 |
ADC aa |
65 |
3 |
ADC aa,X |
75 |
4 |
ADC aaaa |
6D |
4 |
ADC aaaa,X |
7D |
4 |
ADC aaaa,Y |
79 |
4 |
ADC (aaaa,X) |
61 |
6 |
ADC (aaaa),Y |
71 |
5 |
AND - " ET " logique entre donnée et l'accumulateur
Effectuer l'opération logique " et " entre une donnée et l'accumulateur avec affectation dans l'accumulateur.
Opération effectuée :
d valeur indiqué ou provenant d'un adresse mémoire
A et d affecte A
Flags modifiés :
N = 1 si le bit 7 = 1, Z = 1 si A = 0
Instructions |
Opcode |
Nb. cycle |
AND #dd |
29 |
2 |
AND aa |
25 |
2 |
AND aa,X |
35 |
2 |
AND aaaa |
2D |
3 |
AND aaaa,X |
3D |
3 |
AND aaaa,Y |
39 |
3 |
AND (aa,X) |
21 |
2 |
AND (aa),Y |
31 |
2 |
Déplacer tous les bits de 1 sur la gauche. Le bit 0 est positionné à 0 et le bit 7 est placé dans le flag carry.
Ceci est équivalent à multiplier par deux un nombre non signé.
Opération effectuée:
A * 2 ou M * 2 avec M = aa ou aaaa
Flags modifiés:
N = 1 si bit 7 passe à 1, Z = 1 si A = 0, C = valeur du bit 7 sortant
Instructions |
Opcode |
Nb. cycle |
ASL A |
0A |
2 |
ASL aa |
06 |
5 |
ASL aa,X |
16 |
6 |
ASL aaaa |
0E |
6 |
ASL aaaa,X |
1E |
7 |
Si C=0 (pas de retenue), ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
Instructions |
Opcode |
Nb. cycle |
BCC aa |
90 |
2 à 3 |
Voir aussi BCS
Si C=1 (il y a une retenue) , ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
BCS
Instructions |
Opcode |
Nb. cycle |
BCS aa |
B0 |
2 à 3 |
Voir aussi BCC
Si Z=1 (donc résultat de la comparaison, ou de l'opération = 0), ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
Instructions |
Opcode |
Nb. cycle |
BEQ aa |
F0 |
2 à 3 |
Voir aussi BNE
Cette instruction permet de tester la valeur de 1 ou plusieurs bits d'une zone mémoire.
Le masque est stocké dans l'accumulateur et un "et" logique est effectué avec la valeur en mémoire. Le flag Z est alors positioné à 1 si A et mémoire = 0.
Le bit 7 de la zone mémoire est positionné dans le flag N, le bit 6 dans le flag V.
Flags modifiés:
d = contenu de aa ou de aaaa
Si A & d alors Z = 1, N = bit 7 de d, V = bit 6.
Instructions |
Opcode |
Nb. cycle |
BIT aa |
24 |
2 |
BIT aaaa |
2C |
3 |
Si N=1 (donc nombre négatif), ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
Instructions |
Opcode |
Nb. cycle |
BMI aa |
30 |
2 à 3 |
Voir aussi BPL
Si Z=0 (donc résultat de la comparaison ou de l'opération <> 0), ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
Instructions |
Opcode |
Nb. cycle |
BNE aa |
D0 |
2 à 3 |
Voir aussi BEQ
Si N=0 (donc nombre positif), ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
Instructions |
Opcode |
Nb. cycle |
BPL aa |
10 |
2 à 3 |
Voir aussi BMI
Forcer la génération d'une interruption. Les registres Program counter et Processor status sont stockés dans la pile. Le vecteur d'interruption est alors chargé dans le program counter. Le flag B est positionné.
Flags modifiés:
B = 1
Instructions |
Opcode |
Nb. cycle |
BRK |
$00 |
7 |
BVC - Branch if oVerflow Clear
Si V=0, ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
Instructions |
Opcode |
Nb. cycle |
BVC aa |
50 |
2 à 3 |
Voir aussi BVS
Si V=0, ajouter la valeur de déplacement (déplacement relatif) à PC (Program Counter) pour exécuter la nouvelle instruction.
Instructions |
Opcode |
Nb. cycle |
BVS aa |
70 |
2 à 3 |
Voir aussi BVC
Remettre à zéro le flag C. Généralement, vous utiliserez cette commande avant d'effectuer une addition ADC sur 8 bits, ou sur la partie basse d'un nombre sur 16 bits, mais dans le cas d'une addition sur la partie haute d'un nombre sur 16 bits, vous aurez peut-être à prendre en compte l'éventuel retenu de votre première addition sur la partie basse du nombre sur 16 bits. Dans ce cas, il ne faudra surtout pas faire appel à cette commande avant de faire l'addition sur la partie haute.
Flags modifiés:
C = 0
Instructions |
Opcode |
Nb. cycle |
CLC |
18 |
2 |
Voir aussi SEC
Remettre à 0 le flag mode décimal. Il est fortement conseillé de remettre ce flag à 0 avant de faire une addition ou une soustraction. Il n'est effectivement pas repositionné à 0 à la fin d'une interruption.
Flags modifiés:
D = 0
Instructions |
Opcode |
Nb. cycle |
CLD |
D8 |
2 |
Voir aussi SED
Positionne le flag I à 0.
Flags modifiés:
I=0
Instructions |
Opcode |
Nb. cycle |
CLI |
58 |
2 |
Voir aussi SEI
Positionne le flag V à 0
Flags modifiés:
V=0
Instructions |
Opcode |
Nb. cycle |
CLV |
B8 |
2 |
Comparer une valeur avec le contenu de l'accumulateur.
Accumulateur - donnée affecte les flags N, Z, C
Flags modifiés:
Si A < d alors N=1, Z=0, C=0
Si A = d alors N=0, Z=1, C=1
Si A > d alors N=0, Z=0, C=1
Instructions |
Opcode |
Nb. cycle |
CMP #dd |
C9 |
2 |
CMP aa |
C5 |
3 |
CMP aa,X |
D5 |
4 |
CMP aaaa |
CD |
4 |
CMP aaaa,X |
DD |
4 |
CMP aaaa,Y |
D9 |
4 |
CMP (aa,X) |
C1 |
6 |
CMP (aa),Y |
D1 |
5 |
Comparer une valeur avec le contenu du registre X.
X - donnée affecte les flags N, Z, C
Flags modifiés:
Si X < d alors N=1, Z=0, C=0
Si X = d alors N=0, Z=1, C=1
Si X > d alors N=0, Z=0, C=1
Instructions |
Opcode |
Nb. cycle |
CPX #dd |
E0 |
2 |
CPX aa |
E4 |
3 |
CPX aaaa |
EC |
4 |
Comparer une valeur avec le contenu du registre Y.
Y - donnée affecte les flags N, Z, C
Flags modifiés:
Si Y < d alors N=1, Z=0, C=0
Si Y = d alors N=0, Z=1, C=1
Si Y > d alors N=0, Z=0, C=1
Instructions |
Opcode |
Nb. cycle |
CPY #dd |
C0 |
2 |
CPY aa |
C4 |
3 |
CPY aaaa |
CC |
4 |
Décrémente la mémoire de 1.
aa = aa - 1
aaaa = aaaa - 1
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
DEC aa |
C6 |
5 |
DEC aa,X |
D6 |
6 |
DEC aaaa |
CE |
6 |
DEC aaaa,X |
DE |
7 |
Voir aussi DEX, DEY, INC, INX, INY
Décrémente le registre X de 1.
X = X - 1
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
DEX |
CA |
2 |
Voir aussi DEC, DEY, INC, INX, INY
Décrémente le registre Y de 1.
Y = Y - 1
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
DEY |
88 |
2 |
Voir aussi DEC, DEX, INC, INX, INY
Effectuer un ou exclusif entre une donnée et l'accumulateur. L'accumulateur recevant le résultat.
A xor M -> A N, Z
A = A EOR d
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
EOR #dd |
49 |
2 |
EOR aa |
45 |
3 |
EOR aa,X |
55 |
4 |
EOR aaaa |
4D |
4 |
EOR aaaa,X |
5D |
4 |
EOR aaaa,Y |
59 |
4 |
EOR (aa,X) |
41 |
6 |
EOR (aa),Y |
51 |
5 |
incrémente la mémoire de 1.
aa = aa + 1
aaaa = aaaa + 1
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
INC aa |
E6 |
5 |
INC aa,X |
F6 |
6 |
INC aaaa |
EE |
6 |
INC aaaa,X |
FE |
7 |
Voir aussi INX, INY, DEC, DEX, DEY
Incrémente le registre X de 1.
X = X + 1
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
INX |
E8 |
2 |
Voir aussi INC, INY, DEC, DEX, DEY
Incrémente le registre Y de 1.
Y = Y + 1
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
INY |
C8 |
2 |
Voir aussi INC, INX, DEC, DEX, DEY
Positionne le registre PC à la valeur spécifiée après l'opérande.
Remarque, cette instruction serait buggée en adressage indirect (jamais fait le test). Le problème se poserait dans le cas où l'adresse du pointeur serait sur une adresse se terminant par FF. le processeur saute à l'adresse déduit de (xxFF) et (xx00) et non pas l'adresse déduit de (xxFF) et (xxFF+1). Ce bug est corrigé ensuite avec le 65SC02, mais pour des raisons de compatibilité, il vaut mieux éviter de pointer sur ce genre d'adresse.
Instructions |
Opcode |
Nb. cycle |
JMP aaaa |
4C |
3 |
JMP (aaaa) |
6C |
5 |
Voir aussi JSR
L'instruction JSR stocke sur la pile l'adresse de retour et positionne ensuite la valeur indiqué après l'opérande sur le registre PC.
Instructions |
Opcode |
Nb. cycle |
JSR aaaa |
20 |
6 |
Voir aussi JMP
Charge une valeur dans l'accumulateur.
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
LDA #dd |
A9 |
2 |
LDA aa |
A5 |
3 |
LDA aa,X |
B5 |
4 |
LDA aaaa |
AD |
4 |
LDA aaaa,X |
BD |
4 |
LDA aaaa,Y |
B9 |
4 |
LDA (aa,X) |
A1 |
6 |
LDA (aa),Y |
B1 |
5 |
Charge une valeur dans le registre X.
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
LDX #aa |
A2 |
2 |
LDX aa |
A6 |
3 |
LDX aa,Y |
B6 |
4 |
LDX aaaa |
AE |
4 |
LDX aaaa,Y |
BE |
4 |
Charge une valeur dans le registre Y.
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
Nb. cycle |
LDY #aa |
A0 |
2 |
|
LDY aa |
A4 |
3 |
|
LDY aa,X |
B4 |
4 |
|
LDY aaaa |
AC |
4 |
|
LDY aaaa,X |
BC |
4 |
Déplacement à droite de tous les bits. Le bit 7 est positionné à 0.
Flags modifiés:
Z = 1 si le résultat = 0
C = valeur du bit 0 sortant.
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
LSR A |
4A |
2 |
LSR aa |
46 |
5 |
LSR aa,X |
56 |
6 |
LSR aaaa |
4E |
6 |
LSR aaaa,X |
5E |
7 |
Rien, cette instruction ne fais rien du tout, sauf mangé un peu de cycle.
Cette instruction peut donc servir dans le cas de code automodifiable (bien que je le déconseille) ou, pour synchroniser des traitements (grâce aux 2 cycles consommés).
Instructions |
Opcode |
Nb. cycle |
NOP |
EA |
2 |
Ou inclusive entre une valeur et l'accumulateur.
d OR A affecte A
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
ORA #dd |
09 |
2 |
ORA aa |
05 |
3 |
ORA aa,X |
15 |
4 |
ORA aaaa |
0D |
4 |
ORA aaaa,X |
1D |
4 |
ORA aaaa,Y |
19 |
4 |
ORA (aa,X) |
01 |
6 |
ORA (aa),Y |
11 |
5 |
Copier la valeur de l'accumulateur sur la pile, maj du pointeur de pile.
Instructions |
Opcode |
Nb. cycle |
PHA |
48 |
3 |
Voir aussi PLA
Copier la valeur du registre d'état (P) sur la pile, maj du pointeur de pile.
Instructions |
Opcode |
Nb. cycle |
PHP |
08 |
3 |
Voir aussi PLP
Copier une valeur de la pile vers l'accumulateur, maj du pointeur de pile.
Voir aussi PHA
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
PLA |
68 |
4 |
Voir aussi PHA
Copier la valeur de la pile vers le registre d'état (P), maj du pointeur de pile.
Instructions Opcode Nb. cycle
PLP 08 3
Flags modifiés:
C, Z, I, D, B, V, N sont positionnés suivant la valeur récupérée
Instructions |
Opcode |
Nb. cycle |
PLP |
28 |
4 |
Voir aussi PHP
Tous les bits sont déplacés de 1 place vers la gauche. La valeur courante du flag carry (flag C) est chargé en bit 0. Le flag carry est alors positionné avec la valeur sortant du bit 7.
Flags modifiés:
C = Valeur du bit 7 avant rotation
Z = 1 si le résultat = 0
N = 1 si la nouvelle valeur du bit 7 est positionné
Instructions |
Opcode |
Nb. cycle |
ROL A |
2A |
2 |
ROL aa |
26 |
5 |
ROL aa,X |
36 |
6 |
ROL aaaa |
2E |
6 |
ROL aaaa,X |
3E |
7 |
Tous les bits sont déplacés de 1 place vers la droite. La valeur courante du flag carry (flag C) est chargé en bit 7. Le flag carry est alors positionné avec la valeur sortant du bit 0.
Flags modifiés:
C = Valeur du bit 7 avant rotation
Z = 1 si le résultat = 0
N = 1 si la nouvelle valeur du bit 7 est positionné
Instructions |
Opcode |
Nb. cycle |
ROR A |
6A |
2 |
ROR aa |
66 |
5 |
ROR aa,X |
76 |
6 |
ROR aaaa |
6E |
6 |
ROR aaaa,X |
7E |
7 |
Cette fonction est utilisée à la fin d'une interruption. Elle repositionne le registre d'état à la valeur avant le déclenchement de l'interruption. Elle repositionne le registre PC à la valeur avant interruption. Ceci ayant pour effet de continuer le code là où le système était avant l'interruption.
Flags modifiés:
C, Z, I, D, B, V, N sont positionnés suivant la valeur récupérée
Instructions |
Opcode |
Nb. cycle |
RTI |
40 |
6 |
Cette fonction est utilisée à la fin d'une sous-routine. Elle repositionne le registre PC sur l'instruction se trouvant après le JSR ayant exécuté cette sous-routine (enfin, normalement, si la pile n'est pas modifiée avant !).
Instructions |
Opcode |
Nb. cycle |
RTS |
60 |
6 |
Voir JSR
soustraire la donnée et 1 - Carry avec l'accumulateur, avec affectation dans l'accumulateur et maj de Carry. Le fait de positionner le flag carry permettant de faire des soustractions sur 16 bits. Il suffit pour cela de refaire un SDC juste après.
Opération effectuée :
A - d - (1- C) affecte A et C
Flags modifiés :
N = 1 si le bit 7 est positionné, Z = 1 si A = 0, C = 1 si nombre négatif est trop petit, V = 1 si le bit 7, qui représente le signe devient incorrect.
Instructions |
Opcode |
Nb. cycle |
SBC #dd |
E9 |
2 |
SBC aa |
E5 |
3 |
SBC aa,X |
F5 |
4 |
SBC aaaa |
ED |
4 |
SBC aaaa,X |
FD |
4 |
SBC aaaa,Y |
F9 |
4 |
SBC (aaaa,X) |
E1 |
6 |
SBC (aaaa),Y |
F1 |
5 |
Positionne le flag carry (flag C) à 1
Flags modifiés :
C = 1
Instructions |
Opcode |
Nb. cycle |
SEC |
38 |
2 |
Voir CLC
Positionne le flag decimal (flag D) à 1
Flags modifiés :
D = 1
Instructions |
Opcode |
Nb. cycle |
SED |
F8 |
2 |
Voir CLD
Positionne le flag interruption (flag I) à 1
Flags modifiés :
I = 1
Instructions |
Opcode |
Nb. cycle |
SEI |
78 |
2 |
Voir CLI
Copier la valeur de l'accumulateur dans une mémoire.
aa = A
ou aaaa = A
Instructions |
Opcode |
Nb. cycle |
STA aa |
85 |
3 |
STA aa,X |
95 |
4 |
STA aaaa |
8D |
4 |
STA aaaa,X |
9D |
5 |
STA aaaa,Y |
99 |
5 |
STA (aa,X) |
81 |
6 |
STA (aa),Y |
91 |
6 |
Copier la valeur du registre X dans une mémoire.
aa = X
ou aaaa = X
Instructions |
Opcode |
Nb. cycle |
STX aa |
86 |
3 |
STX aa,Y |
96 |
4 |
STX aaaa |
8E |
5 |
Copier la valeur du registre Y dans une mémoire.
aa = Y
ou aaaa = Y
Instructions |
Opcode |
Nb. cycle |
STY aa |
84 |
3 |
STY aa,X |
94 |
4 |
STY aaaa |
8C |
5 |
TAX - Transfer Accumulator to X
Copier la valeur de l'accumulateur dans le registre X.
X = A
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
TXA |
AA |
2 |
Voir aussi TAY, TXA, TXS, TSX, TYA
TAY - Transfer Accumulator to Y
Copier la valeur de l'accumulateur dans le registre Y.
Y=A
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
TYA |
A8 |
2 |
Voir aussi TYA, TAX, TXA, TSX, TXS
TSX - Transfer Stack pointer to X
Copier la valeur du registre S dans le registre X.
X=S
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
TXS |
BA |
2 |
Voir aussi TAY, TAX, TXA, TXS, TYA
TXA - Transfer X to Accumulator
Copier la valeur du registre X dans l'accumulateur.
A=X
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
TXA |
8A |
2 |
Voir aussi TAY, TAX, TXS, TSX, TYA
TXS - Transfer X to Stack pointer
Copier la valeur du registre X dans le pointeur de pile.
S=X
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
TXS |
9A |
2 |
Voir aussi TAY, TAX, TXA, TSX, TYA
TYA - Transfer Y to Accumulator
Copier la valeur du registre Y dans l'accumulateur.
A=Y
Flags modifiés:
Z = 1 si le résultat = 0
N = 1 si le bit 7 du résultat est positionné
Instructions |
Opcode |
Nb. cycle |
TYA |
98 |
2 |
Voir aussi TAY, TAX, TXA, TSX, TXS