PuceListe 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).

ADC - ADd with Carry

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

Voir aussi SBC, CLC, CLD

 

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

Voir aussi EOR, ORA

 

ASL - Arithmetic Shift Left

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

 

Voir aussi LSR, ROL, ROR

 

BCC - Branch on Carry Clear

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

BCS - Branch if Carry Set

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

 

BEQ - Branch if EQual

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

 

 

BIT - BitTest

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

 

BMI - Branch if MInus

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

 

BNE - Branch if Not Equal

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

 

BPL - Branch if Positive

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

 

BRK - BReaK

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

BVS - Branch if oVerflow Set

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

 

CLC - CLear Carry flag

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

 

CLD - CLear Decimal mode

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

 

CLI - CLear Interrupt disable

Positionne le flag I à 0.

 

Flags modifiés:

I=0

Instructions

Opcode

Nb. cycle

CLI

58

2

 

Voir aussi SEI

 

CLV - CLear oVerflow flag

Positionne le flag V à 0

 

Flags modifiés:

V=0

Instructions

Opcode

Nb. cycle

CLV

B8

2

 

CMP - CoMPare

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

 

Voir aussi CPX, CPY

 

CPX - ComPare X register

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

Voir aussi CMP, CPY

 

CPY - ComPare Y register

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

Voir aussi CMP, CPX

 

DEC - DECrement

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

 

DEX - Decrement X register

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

 

DEY - Decrement Y register

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

 

EOR - Exclusive OR

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

Voir aussi AND, ORA

 

INC - INCrement

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

 

INX - INcrement X register

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

 

INY - INcrement Y register

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

 

JMP - JuMP

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

 

JSR - Jump to SubRoutine

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

 

LDA - LoaD Accumulator

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

Voir aussi LDX, LDY

 

LDX - Load X Register

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

Voir aussi LDA, LDY

 

LDY - Load Y Register

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

Voir aussi LDA, LDX

 

LSR - Logical Shift Right

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

Voir aussi ASL, ROL, ROR

 

NOP - No OPeration

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

 

ORA - OR with Accumulator

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

Voir aussi AND, EOR

PHA - PusH Accumulator

Copier la valeur de l'accumulateur sur la pile, maj du pointeur de pile.

Instructions

Opcode

Nb. cycle

PHA

48

3

 

Voir aussi PLA

 

PHP - PusH Processor status

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

 

PLA - PulL Accumulator

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

 

PLP - PulL Processor status

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

 

ROL - Rotate Left

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

Voir aussi ASL, RSL, ROR

 

ROR - Rotate Right

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

Voir aussi ASL, RSL, ROL

 

RTI - ReTurn from Interrupt

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

 

RTS - ReTurn from Subroutine

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

 

SBC - SuBtract with Carry

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

Voir aussi ADC, CLC, CLD

 

SEC - Set Carry Flag

Positionne le flag carry (flag C) à 1

 

Flags modifiés :

C = 1

Instructions

Opcode

Nb. cycle

SEC

38

2

Voir CLC

 

SED - Set Decimal Flag

Positionne le flag decimal (flag D) à 1

 

Flags modifiés :

D = 1

Instructions

Opcode

Nb. cycle

SED

F8

2

Voir CLD

 

SEI - Set Interrupt Disable

Positionne le flag interruption (flag I) à 1

 

Flags modifiés :

I = 1

Instructions

Opcode

Nb. cycle

SEI

78

2

Voir CLI

 

STA - STore Accumulator

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

 

Voir aussi STX, STY

 

STX - Store X register

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

 

Voir aussi STA, STY

 

STY- Store Y register

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

 

Voir aussi STA, STX

 

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