v0.9			   ASSEMBLEUR SUR NES
				CRISPYSIX

Lorsque j'ai commenc  m'interesser  la NES, j'ai constitu une sorte de journal
de bord avec de nombreuses notes. Au fur et  mesure de ces notes d'abord rparties
anarchiquement, il m'est venu l'ide d'en faire une sorte de compilation qui
pourrait aisment tre rutilis par d'autres personnes. Ainsi est ne cette documentation.

Je n'ai pas la prtention de vous apprendre  devenir des as en la matire 
mais vu le peu de documents disponibles (en franais du moins c'est le nant), je pense
que ce genre de choses sera loin d'tre inutile pour ceux qui s'intressent
encore  cette vieille machine. Attention la mise en page de cette doc est
chaotique mais a force on risque de s'y habituer...


Si vous avez choisi de commencer  vouloir crer vous mme vos programmes en
assembleur en prenant la NES, je ne peux qu'approuver ce choix, mme s'il ne s'agit pas
 mon avis d'une des machines les plus simples  comprendre et  programmer, c'est
une des mieux documentes, grce  l'acharnement de quelques passionns.
En plus comme beaucoup de personnes semblent aussi attires par la Supernes a ne
peut qu'tre utile (famille de processeur,ect...), je trouve a bien trop
compliqu pour l'instant faire quelque chose de concret au niveau des coprocesseurs.

ASM HACKING -> Attention! Sur NES il est beaucoup plus dlicat que sur SUPERNES,
au niveau de l'adressage, et en lisant cette doc vous devriez comprendre pourquoi.

Note: Les adresses sont donnes en hexa avec un $ devant, les valeurs immdiates avec un #.
Bon il est possible que je fasse des petits ecarts involontaires mais dans l'ensemble c'est a.


J'ai choisie de dcouper cette documentation en 2 parties bien distinctes.
Les points suivants seront abords:

Dans le premier fichier:

- Brve presentation de la NES.
	1. -> Caractristiques fondamentales
	2. -> Vues gnrales sur la mmoire centrale

- Fonctionnnement du processeur 6502.
	1. -> Gnralites sur l'architecture et prsentation des registres du processeur
	2. -> Gnralites sur les modes d'adressages utilises par le 6502
	3. -> Instructions dtailles avec leur fonctionnement
	4. -> Tableau dtaill des opcodes par ordre alphabetique
	5. -> Interruptions

Dans le second fichier:

- Fonctionnement de la PPU (Picture Processing Unit).
	1. -> Partage de la VRAM
	2. -> Tables des graphismes
	3. -> Tables de nommage
	4. -> Tables d'attribution
	5. -> Fonctionnement des palettes
	6. -> Fonctionnement des miroirs
	7. -> Scrolling de l'arrire plan
	8. -> Fonctionnement des sprites
	9. -> VBlank et HBlank

- Fonctionnement des autres peripheriques.
	1. -> Pseudo-Audio Processing Unit
	2. -> Ports Joypads

- Dtails sur les registres de periphriques.
	1. -> Registres PPU
	2. -> Registres pAPU
	3. -> Registres Joypads

- Autres choses utiles.
	1. -> Structure iNes
	2. -> Multi-Memory Controler

- Dtails sur les mthodes d'assemblage.

- Epilogue.


Brve prsentation de la NES:
----------------------------

Bon je vais pas refaire l'histoire de cette console a n'a aucune importance ici.
Juste ce qui est ncessaire donc. La Famicom (nom japonais de la NES) est sortie en
1983 au Japon, fut immediatement un gros succs, sa commercialisation suivi alors
sous le nom de Nintendo Entertainment System logiquement aux Etats-Unis puis en Europe.

	1. Caractristiques fondamentales:

La NES est architcture autour d'un processeur 8 bits, le 2A03, variante du 6502. 
Ce dernier est trs en vogue dans les annes 80 et quipe de nombreux micro-ordinateurs,
comme le C64. Egalement autre composant capital, le PPU pour l'affichage.
Si vous ouvrez une NES vous les apercevrez facilement puisque ce sont les 2 plus
gros composants de la carte mre.

	Dtails techniques:
2 composants principaux:

-Processeur central: 		2A03 NMOS fabriqu par RICOH cadenc  1,7897725 Mhz pour 
				la version NTSC et 1,773447 Mhz pour la version PAL (dtaill aprs).
				Le processeur est cabl  2 ko de RAM.
-Picture Processing Unit:	Unit charge de l'affichage des sprites et des arrires plan. Son utilisation
				particulire sera dtaille plus tard. Elle dispose de 16 ko de VRAM et 
				256 octets pour les sprites.
	Autre:
-Capacites sonores:		La NES dispose de 5 voix sonores, 2 canaux de synthses FM, un canal triangle
				un canal de bruit, et un canal DMC (Delta Modulation Channel).
				Le son est pris en charge par le processeur central.

	2. Vues gnrales sur la mmoire:

Toute la memoire de la NES est reprsente sur une seule et mme plage mmoire,
mais leur utilisation est bien diffrente...
En fait c'est assez simple  introduire et une fois que l'on  compris il n'est pas
ncessaire de revenir l-dessus. Voil comment cela marche:
-de $0  $7FF: Il s'agit de la RAM qui va servir pour le stockage des donnes (2 ko).
-de $800  $1FFF: Miroirs de la RAM tous les #800 octets.
-de $2000  $2007: Registres de la PPU
-de $2008  $3FFF: Autres registres (miroirs des registres de la PPU tous les 8 octets)
-de $4000  $4016: Registres de la pAPU et des manettes
-de $4017  $4FFF: N/A
-de $5000  $5FFF: Expansion
-de $6000  $7FFF: Mmoire SRAM pour les sauvegardes
-de $8000  $BFFF: PRG-ROM (code contenu dans la ROM) d'une taille de $4000 (16384)
-de $C000  $FFFF: PRG-ROM d'une taille de $4000 (16384)

L'utilisation de la VRAM est entirement gre par la PPU, inutile donc de l'aborder ici.
Les deux plages servant  lire du code instruction (PRG-ROM) ne sont pas forcement utilisables
linairement.
Pour les donnes statiques graphiques (stockage du graphisme et des sprites) on utilise plus
souvent la CHR-ROM, dont le fonctionnement sera dtaill plus tard avec la PPU.
Pour le miroir de la mmoire centrale, voyez cela comme un alias:
crire un octet l'adresse $0 l'crit aussi  l'adresse $800, $1000 et $1800.
Remarque: grce au MMC on peut faire varier considrablement la taille et la structure des donnes,
cependant la PRG-ROM restera de toute facon statique (son emplacement est fix et dfinitif).


Fonctionnement du processeur 6502:
---------------------------------
	
Donc le processeur 6502 est dit 8 bits car ses registres de travail sont limits  une taille de 8 bits,
ce qui induit qu'il sera impossible de manipuler des valeur ayant une taille superieure  8 bits.
Ca peut sembler trs limitant au premier abord, mais en ralit...a l'est rellement. 
Cela va vraiment devenir un handicap dans le codage d'algorithmes de compression ou autre.
Cependant (et fort heureusement) le compteur ordinal (Program Counter) est lui en 16 bits. Cel limite
tout de mme l'adressage  64 ko mais pour pouvoir accder  plus de mmoire on a recours au 
MMC (Multi-Memory Controller), qui sera abord plus tard. Les oprandes seront donc de 8 bits.

	1. Gnralites sur l'architecture et prsentation des registres du processeur:

Le processeur 6502 est donc l'unique interface entre l'utilisateur et la machine. Il dispose d'un
jeu d'instructions capable de manipuler des donnes sur une zone d'adresse de 64 ko et 
de 6 registres, 5 8-bits et un de 16 bits.

Program Counter (compteur ordinal): C'est un registre 16 bits qui peut adresser toute la mmoire
disponible sur une plage de $0  $FFFF.
Par defaut, il contient l'adresse de la prochaine instruction 
executer. En outre chaque instruction ne va pas agir de la mme facon.
L'instruction LDA #$12 par exemple incrementera le compteur ordinal de 2.
Il est directement adrss par des instructions ncessitant des adresses (STA,LDA,JSR,...).
En outre le compteur ordinal change  chaque instruction.

Stack Register (pointeur de pile): Registre de 8 bits pointant sur le haut de la pile.
Normalement vous n'avez pas  vous en soucier. L'utilisation de la pile est quelque chose de trs
pratique, comparable  une pile d'assiettes. Utiliser le plus souvent avec les instructions PHA (PUSH) 
et PLA (POP), la pile permet de maitriser aisment les retours de fonctions par exemple.
En revanche attention car l'instruction JSR utilise la pile pour mmoriser l'adresse de retour.
Pour info, la pile est en fait la zone mmoire s'tendant dans la ram de $100  $1FF.
A vous de faire attention de ne pas depasser sa capacit.
Note: il est parfois ncessaire d'initialiser la pile  $FF (Registre pointeur de pile).

Processor Status (registre d'etat): Registre 8 bits qui a une importance capitale puisque qu'il
change en fonction du rsultat des instructions, il va donc permettre d'implementer toutes les
structures conditionnelles, indispensables dans un programme. Pour comprendre son fonctionnement,
il faut voir chaque bits du registre d'etat comme une variable boolenne, qui peut prendre 2 valeurs
vrai ou faux. Voici comment il fonctionne:

	C - Bit 0, Carry Flag (Bit de retenu): comme son nom l'indique ce bit va permettre de mmoriser
		si le rsultat d'une opration est sujet  une retenue. Un exemple simple:
		Imaginons que nous ajoutions 1  255, cela aura pour rsultat 0 avec le bit de retenue  1.
		En outre d'autres instructions comme les instructions de rotation l'utilisent.

	Z - Bit 1, Zero Flag (Bit d'etat Zero): Ce bit est mis  1 lorsque le resultat d'une instruction
		est 0.

	I - Bit 2, Interrupt Disable Flag (Bit d'autorisation d'interruptions): Si ce bit est mis  1 on bloque
		les interruptions non masquables (NMI) venant des periphriques (dtaill en partie 5).

	D - Bit 3, Decimal Mode (Mode dcimal): Si il est mis  1 indique que l'on est en mode dcimal.
		Pas trs utile car limite le nombre de combinaisons pour un octet  255 valeurs.
		De plus sur la version du 6502 utilis sur NES, il n'existe pas de mode dcimal effectif!
		Donc activer ou dsactiver ce flag ne servira  rien.

	B - Bit 4, Break Command (Bit de Break): Si une interruption est cause par l'instruction BRK,
		ce bit est mis  1, il est mis  0 si il s'agit d'une interruption externe.

	V - Bit 6, Overflow Flag (Bit de depassement sign): Ce bit permet de simuler la retenue pour
		2 nombre pseudos signs. C'est a dire que l'on va prendre le calcul de 2 valeurs
		sur 7 uniquement, le dernier servant au signe. Par exemple: 01111111+00000001=10000000
		-> ce calcul ne modifiera pas le flag C mais modifiera le flag V.
	
	N - Bit 7, Negative Flag (Bit de negation): Ce flag est tres li au second, il sert au calcul de valeurs
		signes. En fait ce bit est mis a 1 si le resultat contenu dans l'accumulateur  son bit 7
		mis  1.

Remarque: le bit #5 est inutilis sur le 6502.

	Le registre d'tat peut etre reprsent de la faon suivante:

	+-----+-----+-----+-----+-----+-----+-----+-----+
	|     |     |     |     |     |     |     |     |
	|  N  |  V  |     |  B  |  D  |  I  |  Z  |  C  |
	|     |     |     |     |     |     |     |     |
	+-----+-----+-----+-----+-----+-----+-----+-----+

Les registres de travail (utilisables directement par l'utilisateur):

Accumulator (Accumulateur) A: Il s'agit du registre de travail principal, puisque qu'il va tre utilis
par toutes les instructions utilisant l'unit arithmtique et logique du processeur. C'est  dire que
tous les calculs passeront necessairement par lui.

Registre X: Utilis pour les adressages indexs et le controle des boucles principalement.

Registre Y: Comparable au registre X mais dispose de moins d'instructions et donc de fonctionnalites.

	2. Gnralites sur les modes d'adressages utilises par le 6502:

Les modes d'adressages qui vont tre prsents ne sont pas forcement tous utiliss par les instructions
ncessitant une adresse. Il y en a 12 en tout sur le 6502.

Voici de quoi il retourne:
	
	Adressage immdiat: S'utilise de la forme "#$??" o $?? est l'oprande l'hexa  charger par l'instruction.
		Il s'agit du mode d'adressage le plus simple puisqu'on n'utilise pas le compteur ordinal.
		Bien entendu il ne s'utilise qu'en lecture.

	Adressage absolu: Dans ce mode on utilise le compteur ordinal, la syntaxe est la suivante: "LDA aaaa"
		o aaaa contient l'adresse de l'operande  charger dans l'accumulateur.

	Adressage page zero: Similaire au prcdent mais l on utilise que 8 bits pour l'adresse, ce qui limite
		l'adressage a la page mmoire 0 (cad de $0  $FF), utile pour allger le code.

	Adressage indirect absolu: La seule instruction a l'utiliser est l'instruction JMP. Sa syntaxe est "($aaaa)".
		En fait l'adresse aaaa contient l'adresse de l'oprande. Attention ne pas oublier que le 6502
		fonctionne en mode Little Endian! Ainsi l'adresse pointe sur la seconde oprande de l'adresse, il faut
		faire une permutation.

	Adressage absolu index: On va utiliser les registres X et Y pour ce type d'adressage. La syntaxe est la suivante:
		"$aaaa, ?" o aaaa est l'adresse et ? est un registre X ou Y. Par exemple "LDA $1285,X" et X contenant 5
		donnera comme adresse $1285+$5=$128A.

	Adressage index page zero: Similaire a l'exemple precedent sauf que l'adresse ne s'tend que 8 bits.

	Adressage index indirect: La syntaxe de ce mode d'adressage est la suivante: "($aa,?)" o aa contient
		l'adresse et ? le nom du registre (X ou Y)  ajouter a l'adresse pour obtenir l'adresse definitive
		de l'oprande.

	Adressage indirect index: La syntaxe ressemble  la precedente: "($aa),?" sauf que on va d'abord chercher l'adresse
		trouv en aa et ensuite on y ajoute la valeur du registre ? pour obtenir l'adresse finale l'oprande.

	Adressage relatif: utilis par les instructions de branchement (dtailles aprs). Il s'agit de considrer les
		oprandes 8 bits passes a l'instruction comme des valeurs signes, cela va permettre d'effectuer
		des branchements vers des instructions antrieures en mmoire. Il s'agit en fait d'incrmenter ou
		dcrementer le compteur ordinal avec l'oprande que l'on passe.
		Exemple: 01111111=127
			 10000000=-128

	Adressage impli: l'adressage n'en est en fait pas vraiment un puisqu'il est transparent dans l'instruction,
		qui ne ncessite pas de valeurs en paramtre (juste la taille de l'opcode).

		+-------------------------------+---------------+
		|Adressage immdiat		|#$??		|		
		|Adressage absolu		|$????		|
		|Adressage page zero		|$??		|
		|Adressage indirect absolu	|($????)	|
		|Adressage absolu index	|$????,X	|
		|Adressage index page zero	|$??,X		|
		|Adressage index indirect	|($??,X)	|
		|Adressage indirect index	|($??),X	|
		|Adressage relatif		|$??  ->sign	|
		|Adressage impli		|		|
		+-------------------------------+---------------+

Remarque: on peut remplacer le registre X par le registre Y indifframent sauf pour certaines instructions.

	3. Instructions dtailles avec leur fonctionnement:


Le processeur 6502 compte 56 mnmonics differents (comprenez noms d'instructions). En outre pour chaque instruction vue
certaines peuvent faire l'objet de plusieurs modes d'adressages differents. (leurs opcodes seront bien entendu diffrents).
Les modes d'adressages possibles par instruction seront dtaills dans la partie Opcodes.
Note: A=Accumulateur
Parenthse: le langage machine (comprenez celui qui utilise les instructions) n'est absolument pas le plus bas niveau du
processeur. Lorsque l'on dit que le 6502 est cadenc  1,773447 Mhz, a signifie qu'il peut faire 1 million 773447 cycle
d'horloge par seconde, hors selon les instructions le nombre de cycle d'horloge varie relativement beaucoup selon les
instructions utilises. Il existe des documentations sur le 6502 relativement compltes pour ce genre de choses.

Voici les instructions disponibles dans l'ordre alphabetique:

ADC - Add with Carry -
Flags affcts: N,Z,C,V
Additionne A avec l'operande dsigne par le mode d'adressage, ainsi que le bit de retenue 
et place le resultat dans A. Selon les rsultats les flags sont mis  jour. Si vous voulez effectuer
une addition vierge il ne faut pas oublier de remettre  zero le bit de retenue (C).

AND - Logical AND (ET Logique) -
Flags affcts: N,Z
Effectue un ET logique entre A et l'oprande dsigne par le mode d'adressage utilis et place le
rsultat dans A. En fonction de A les bits de flags sont mis  jour. Utile pour masquer une valeur.
Le ET logique fonctionne comme suit:
	A: 		#10010111b
	oprande: 	#11010010b
			----------
	A:		#10010010b

Le bit de rsultat est mis  1 SI et SEULEMENT SI le bit des deux oprandes sont  1.

ASL - Arithmetic Shift Left -
Flags affcts: N,C,Z
Comme son nom l'indique, cette fonction va effectuer un dcalage des bits vers la gauche de l'operande passe
en paramtre et placer le rsultat dans cette mme oprande. Si le bit 7 de l'oprande est  1 le bit de retenue
sera mis  1.
	Operande:	#10010100b
			----------
	Rsultat:	#00101000b avec bit de retenue  1
	   _________________
	C<-|7|6|5|4|3|2|1|0|<-0
	   

BCC - Branch if Carry Clear - Instruction de branchement -
Flags affcts: aucuns
Il s'agit d'une instruction de branchement. Le saut  l'adresse indique en paramtre est effctu si le bit
de retenue (flag C) est  0 (clear). Le seul mode d'adressage est le mode relatif (voir modes d'adressages).
Si le bit de retenue est  1, le cycle continue normalement (compteur ordinal incrment).

BCS - Branch if Carry Set - Instruction de branchement -
Flags affcts: aucuns
Comme la prcdente instruction sauf que le branchement s'effectue uniquement si le bit de retenue est  1,
sinon le programme continue.

BEQ - Branch if Equal - Instruction de branchement -
Flags affcts: aucuns
Cette instruction effectue un branchement uniquement si le bit d'etat Zero (Z) est  1, sinon poursuit sur la
prochaine instruction. Utile pour controler une boucle (souvent avec les registres X et Y).

BIT - Bit Test -
Flags affcts: N,V,Z
Effectue un ET logique entre A et l'oprande passe en paramtre (M) et mets le flag  jour mais ne mets pas
le rsultat dans A. A ET M est calcul est le resultat est test.
Exemple: si A ET M = 0 -> flag Z = 1

BMI - Branch if Minus - Instruction de branchement -
Flags affcts: aucuns
Effectue un branchement si le bit d'etat ngatif (N) est  1. Sinon le programme continue sur la prochaine
instruction  executer.

BNE - Branch if not Equal - Instruction de branchement -
Flags affcts: aucuns
Effectue un branchement  l'adresse indique si le bit d'etat zero (Z) est  0. Sinon poursuit sur la prochaine
instruction.

BPL - Branch on Plus -  Instruction de branchement -
Flags affcts: aucuns
Effectue un branchement  l'adresse indique si le bit d'etat negatif (N) est  0. Sinon poursuit sur la prochaine
instruction.

BRK - Break -
Flags affcts: B,I
Cette instruction force l'execution d'une interruption IRQ est mets les flags B (Break) et I (Interrupt)  1.
Les dtails sur les interruptions seront voqus aprs.

BVC - Branch if Overflow Clear -
Flags affcts: aucuns
Effectue un branchement  l'adresse indique si le bit de dpassement sign (V) est  0. Sinon poursuit sur la prochaine
instruction.

BVS - Branch if Overflow Set -
Flags affcts: aucuns
Effectue un branchement  l'adresse indique si le bit de dpassement sign (V) est  1. Sinon poursuit sur la prochaine
instruction.

CLC - Clear Carry -
Flags affcts: C
Cette instruction remet le bit de retenue du registre d'etat  0. Indispensable avant de faire un nouveau
calcul  l'aide de l'instruction ADC par exemple.

CLD - Clear Decimal Mode -
Flags affcts: D
Cette instruction met le bit du mode dcimal (D)  zero. Normalement inutile vu que le processeur commence avec son
registre d'tat  0.

CLI - Clear Interrupt Disable -
Flags affcts: I
Cette instruction remet le flag de bloquage des interruptions (I)  0, autorisant ainsi  nouveau les interruptions.

CLV - Clear Overflow Flag -
Flags affcts: V
Cette instruction met le flag d'indication de depassement sign (V)  0. Indispensable si vous faites des calculs signs
car ils utilisent ce flag.

CMP - Compare Memory And Accumulateur (comparaison de l'accumulateur avec une valeur en mmoire centrale) -
Flags affcts: N,Z,C
Il s'agit d'une instruction de comparaison indispensable pour la cration de structures conditionelles, pour pouvoir
utiliser ensuite les instructions de branchement. Son fonctionnement est tabli comme suit:
Si A < oprande -> N=1, Z=0, C=0
Si A = oprande -> N=0, Z=1, C=1
Si A > oprande -> N=0, Z=0, C=1
Pour dfinir la valeur de l'oprande on dispose de nombreux modes d'adressage applicables  l'accumulateur.
Cette instruction ne donne pas de rsultat mais modifie systmatiquement les 3 flags N,Z et C.

CPX - Compare Memory And X (comparaison du registre X et d'une oprande) -
Flags affcts: N,Z,C
Pareil que l'instruction prcdente mais ici appliqu au registre X, ce qui signifie que beaucoup moins de modes
d'adressages seront disponibles (voir table des opcodes pour dtail).

CPY - Compare Memory And Y (comparaison du registre Y et d'une oprande) -
Flags affcts: N,Z,C
Mme remarque que pour l'instruction prcdente.

DEC - Decrement Source -
Flags affcts: N,Z
On passe une adresse mmoire d'une oprande, on la dcrmente et on place le rsultat dans cette mme adresse
mmoire. Les flags N et Z seront mis  jour en consquence (Z si oprande == 0, N si bit 7 de l'oprande est  1).
Seuls les modes d'adressage absolus sont disponibles pour cette instruction.

DEX - Decrement X -
Flags affcts: N,Z
Exactement la mme chose que l'instruction prcdente, mais ici appliqu au registre X. On n'a donc plus besoin
de passer une adresse  l'instruction.
Remarque interessante: sur cette version du processeur, il n'y pas d'instruction pour incrmenter ou decrmenter
le registre accumulateur! Un oubli qui sera combl sur le 65C02.

DEY - Decrement Y -
Flags affcts: N,Z
Bon est-il vraiment besoin de parler de ca...

EOR - Exclusive-OR (OU exclusif de la memoire avec l'accumulateur) -
Flags affcts: N,Z
Encore une instruction logique, un peu plus complexe puisqu'elle correspond a un "( NON (A ET B)) ET (A OU B)"
c'est  dire que vous ne mettez le bit  1 que si un seul des bits d'origine est  1, sinon 0.
Voil comment ca marche:
	oprande: #10010110b
	A	: #11011011b
		  ----------
	A	: #01001101b
En fonction du rsultat les flags N et Z seront mis  jour de la mme faon que d'habitude.

INC - Increment Memory -
Flags affcts: N,Z
Incrmente de 1 l'oprande dont l'adresse est passe en paramtre  l'instruction (dfinie par le mode d'adressage).
En fonction du rsultat les flags N et Z sont mis  jour.

INX - Increment X -
Flags affcts: N,Z
Mme chose mais pour le registre X. Pas besoin de passer l'adresse c'est une instruction implie.

INY - Increment Y -
Flags affcts: N,Z
Mme chose mais pour le registre Y. Pas besoin de passer l'adresse c'est une instruction implie.

JMP - Jump -
Flags affcts: aucuns
Un grand classique, cette instruction effectue un saut inconditionnel direct  l'adresse indique dans le programme
et xecute l'instruction suivante  cette adresse. Elle dispose de 2 modes d'adressage: absolu et, particulier
puisqu'elle est la seule sur le 6502  l'utiliser, le mode d'adressage indirect absolu 
(voir plus haut pour son fonctionnement).

JSR -  Jump to SubRoutine -
Flags affcts: aucuns
Cette instruction permet de faire un saut vers un sous-code situ dans la suite d'instruction langage machine (PRG-ROM).
L'appel de cette instruction suppose necessairement l'appel prochain de l'instruction RTS ou RTI (voir plus loin).
Alord quelle difference avec l'appel de JMP? Bien cela se situe au niveau de la pile...
Le contenu du registre compteur ordinal (Program Counter) est mis sur la pile  l'appel d'une instruction JSR.
Celui-ci est automatiquement dpil et restaur  l'appel de RTS.
Comme la plupart du temps on utilise JSR pour simuler le fonctionnement de fonctions, il faudra prvoir
le passage des paramtres. La solution la plus simple consiste a utiliser les registres.
Si vous utilisez la pile faites attention au fait que l'on sauvegarde 16 bits sur la pile  l'appel de JSR et
donc vos paramtres risquent de se retrouver en dessous.
Le seul mode d'adressage disponible pour cette instruction est absolu.

LDA - Load Accumulator (charger dans l'accumulateur) -
Flags affcts: N,Z
On passe une adresse en paramtre  l'instruction LDA, l'oprande situe  cette adresse en mmoire centrale
est charge dans l'accumulateur, puis la valeur mise dans l'accumulateur est value pour determiner les flags N et Z.

LDX - Load Register X (charger dans registre X) -
Flags affcts: N,Z
La mme chose que prcedemment, xcpt le fait que les modes d'adressage indx ne peuvent tre utiliss.

LDY - Load Register Y (charger dans registre Y) -
Flags affcts: N,Z
Pareil qu'avant mais pour le registre Y.

LSR - Logical Shift Right -
Flags affcts: N,C,Z
Semblable  l'instruction ASL mais ici le dcalage s'effectue vers la droite. On peut soit effectuer le decalage
sur une oprande situe en mmoire centrale, soit sur l'accumulateur (A). Si le bit 0 est  1 avant dcalage alors
on met le bit de retenue du registre d'tat  1 (C), sinon  0.
Exemple:
	oprande: #10010101b
		  ---------
	aprs:	: #01001010b avec flag Carry  1
En fonction du rsultat les bits N et Z seront mis  jour comme d'habitude.

	   _________________
	0->|7|6|5|4|3|2|1|0|->C
	   

NOP - No Opration -
Flags affcts: aucuns
Cette instruction n'effectue rien mais correspond  un cycle complet d'execution d'horloge du processeur, par
consquent elle est trs utile pour ralentir le programme sur une machine dont on sait que la vitesse du processeur
restera constant (c'est le cas de la NES), mais il est plus rigoureux de passer par la mthode du VBlank.

ORA - Logical Inclusive OR ( OU logique) -
Flags affcts: N,Z
Cette instruction effectue un OU logique entre l'accumulateur et une oprande situe en mmoire centrale.
Le OU a un fonctionnement trs simple: si au moins 1 des 2 bits sont  1, le bit de rsultat est  1.
Voil comment cela fonctionne en dtail:
	Accumulateur:	#10010100b
	oprande    :	#01001001b
			----------
	Accumulateur:   #11011101b
En fonction du rsultat dans l'accumulateur, les flags N et Z seront mis  jour.

PHA - Push A -
Flags affcts: aucuns
Cette instruction copie l'oprande contenue dans l'accumulateur et l'empile (la place au sommet de la pile).
A chaque oprande empile bien entendu le pointeur de pile est incrment.

PHP - Push Processor Status Register (empiler le registre d'etat) -
Flags affcts: aucuns
Cette instruction empile le contenu du registre d'etat. C'est la seule facon d'acceder  son contenu.
C'est trs pratique pour executer une suite d'instruction et tre sur de pouvoir rcuprer son contenu intact
aprs ( l'aide de l'instruction PLP).

PLA - Pull Accumulator (dpiler dans l'accumulateur) -
Flags affcts: N,Z
L'instruction transfert la valeur situe au sommet de la pile dans l'accumulateur et
dcrmente le pointeur de pile. En fonction de l'oprande place dans l'accumulateur
les flags N et Z sont mis  jour.

PLP - Pull Processor Status (dpiler dans le registre d'tat) -
Flags affcts: tous
Cette instruction va dpiler dans le registre d'etat, de fait TOUS les flags seront soumis
 un eventuel changement.

ROL - Rotate Left (rotation binaire vers la gauche) -
Flags affcts: N,Z,C
Cette instruction peut sembler identique  ASL mais elle possde une diffrence fondamentale, en effet le contenu
du bit de retenue est mis au dbut de l'oprande sur laquelle on effectue un ROL.
Voil un bref exemple de son fonctionnement:
	CLC ; on s'assure que le carry flag est bien  0
	LDA #10010010b
	ROL A ; a ce moment on va avoir dans A la valeur suivante: #00100100b avec notre carry flag  1
	ROL A ; maintenant le contenu de A est: #01001001b , le carry flag est  0
L'oprande pass en paramtre  cette instruction peut tre indiffrement l'accumulateur ou une oprande
situe en mmoire centrale.
	   _________________
	C<-|7|6|5|4|3|2|1|0|<-C
	   

ROR - Rotate Right (rotation binaire vers la droite) -
Flags affcts: N,Z,C
Son fonctionnement est identique  celui de LSR mais avec les particularits du point de vue de la retenue
nonces ci-dessus.
	   _________________
	C->|7|6|5|4|3|2|1|0|->C
	   
RTI - Return from Interrupt -
Flags affcts: aucuns
Aprs l'executation d'une interruption cela permet de restaurer le contenu du compteur ordinal et revenir dans le
programme au moment o l'execution de l'interruption avait commenc.

RTS - Return from SubRoutine -
Flags affcts: aucuns
Cette instruction dpile 16 bits pour les mettre dans le registre compteur ordinal (adresse  l'appel de l'instruction JSR)
ce qui provoque un retour  l'endroit d'appel de sous routine dans le programme (PRG-ROM).

SBC - Substract with Carry -
Flags affcts: N,Z,C,V
Soustrait de l'accumulateur une oprande dont la valeur se trouve  l'adresse passe en paramtre  l'instruction.
Le rsultat est plac dans l'accumulateur est valu pour dterminer le nouvel tat des flags N,Z,C et V.
Attention ne pas oublier la valeur du bit de retenue (flag C).

SEC - Set Carry Flag -
Flags affcts: C
Cette instruction met juste le bit de retenue (C)  1.

SED - Set Decimal Mode -
Flags affcts: D
Cette instruction met le bit de mode dcimal (D)  1.

SEI - Set Interrupt Disable -
Flags affcts: I
Permet de mettre le flag I (Interrupt Disable)  1. Cela permet de bloquer les interruptions autres que les NMI 
(Non Masquable).

STA - Store Accumulator -
Flags affcts: aucuns
Copie le contenu de l'accumulateur  l'adresse en mmoire centrale passe en paramtre  l'instruction.

STX - Store X Register -
Flags affcts: aucuns
Pareil que l'instruction prcedente mais ici pour le registre X, par consquent les modes d'adressages indxs ne peuvent
pas tre utiliss.

STY - Store Y Register -
Flags affcts: aucuns
Mme chose que prcdement mais pour le registre Y.

TAX - Transfer Accumulator to X (transfert l'accumulateur vers registre X) -
Flags affcts: N,Z
Copie le contenu de l'accumulateur dans X, et mets les flags N et Z  jour en fonction du rsultat (normalement inutile).

TAY - Transfer Accumulator to Y (transfert l'accumulateur vers registre Y) -
Flags affcts: N,Z
Mme chose que prcedement mais pour le registre Y.

TSX - Transfer Stack To X (Mets le contenu du registre pointeur de pile dans le registre X) -
Flags affcts: N,Z
Mets la valeur du registre pointeur de pile dans le registre X, ce qui permet de savoir sur quelle valeur pointe
actuellement le pointeur de pile. Les flags sont mis  jour en fonction de la valeur dans le registre X.

TXA - Transfer X to Accumulator -
Flags affcts: N,Z
Copie la valeur contenue dans le registre X dans l'accumulateur et mets les flags N et Z  jour.

TXS - Transfer X to Stack -
Flags affcts: N,Z
Copie le contenu du registre X dans le registre pointeur de pile (S), c'est la seule facon de modifier directement le 
pointeur de pile. Cette instruction est notamment utilise au dbut d'un programme car le pointeur de pile ne commence
pas automatiquement  l'endroit adquate ($FF).
On peut galement s'en servir pour manipuler la pile plus prcisement (passage de paramtre par la pile par exemple).

TYA - Transfer Y to Accumulator -
Flags affcts: N,Z
Copie la valeur contenue dans le registre Y dans l'accumulateur et mets les flags N et Z  jour.

	4. Tableau dtaill des opcodes par ordre alphabetique:

--------------------------------------------------
   ADC  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      ADC        #aa                   69	2
      ADC        $aa                    65	2
      ADC        $aa,X                  75	2
      ADC        $aaaa                  6D	3
      ADC        $aaaa,X                7D	3
      ADC        $aaaa,Y                79	3
      ADC        ($aa,X)                61	2
      ADC        ($aa),Y                71	2

--------------------------------------------------
   AND  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      AND        #aa                   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

--------------------------------------------------
   ASL  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      ASL        A                     0A	1
      ASL        $aa                    06	2
      ASL        $aa,X                  16	2
      ASL        $aaaa                  0E	3
      ASL        $aaaa,X                1E	3

--------------------------------------------------
   BCC  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BCC        $aa                    90	2

--------------------------------------------------
   BCS  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BCS        $aa                    B0	2

--------------------------------------------------
   BEQ  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BEQ        $aa                    F0	2

--------------------------------------------------
   BIT  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BIT        $aa                    24	2
      BIT        $aaaa                  2C	3

--------------------------------------------------
   BMI  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BMI        $aa                    30	2

--------------------------------------------------
   BNE  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BNE        $aa                    D0	2

--------------------------------------------------
   BPL  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BPL        $aa                    10	2

--------------------------------------------------
   BRK  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BRK                              00	1

--------------------------------------------------
   BVC  -
      Mnemonic   Mode d'adressage     Opcode	Taille
      
      BVC        $aa                    50	2

--------------------------------------------------
   BVS  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      BVS        $aa                    70	2

--------------------------------------------------
   CLC  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      CLC                              18	1

--------------------------------------------------
   CLD  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      CLD                              D8	1

--------------------------------------------------
  CLI  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      CLI                              58	1

--------------------------------------------------
   CLV  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      CLV                              B8	1

--------------------------------------------------
   CMP  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      CMP        #aa                   C9	2
      CMP        $aa                    C5	2
      CMP        $aa,X                  D5	2
      CMP        $aaaa                  CD	3
      CMP        $aaaa,X                DD	3
      CMP        $aaaa,Y                D9	3
      CMP        ($aa,X)                C1	2
      CMP        ($aa),Y                D1	2

--------------------------------------------------
   CPX  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      CPX        #aa                   E0	2
      CPX        $aa                    E4	2
      CPX        $aaaa                  EC	3

--------------------------------------------------
   CPY  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      CPY        #aa                   C0	2
      CPY        $aa                    C4	2
      CPY        $aaaa                  CC	3

--------------------------------------------------
   DEC  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      DEC        $aa                    C6	2
      DEC        $aa,X                  D6	2
      DEC        $aaaa                  CE	3
      DEC        $aaaa,X                DE	3

--------------------------------------------------
   DEX  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      DEX                              CA	1

--------------------------------------------------
   DEY  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      DEY                              88	1

--------------------------------------------------
   EOR  -
      Mnemonic   Mode d'adressage     Opcode	Taille
      
      EOR        #aa                   49	2
      EOR        $aa                   45	2
      EOR        $aa,X                 55	2
      EOR        $aaaa                 4D	3
      EOR        $aaaa,X               5D	3
      EOR        $aaaa,Y               59	3
      EOR        ($aa,X)               41	2
      EOR        ($aa),Y               51	2

--------------------------------------------------
   INC  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      INC        $aa                    E6	2
      INC        $aa,X                  F6	2
      INC        $aaaa                  EE	3
      INC        $aaaa,X                FE	3

--------------------------------------------------
   INX  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      INX                              E8	1

--------------------------------------------------
   INY  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      INY                              C8	1

--------------------------------------------------
   JMP  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      JMP        $aaaa                 4C	3
      JMP        ($aaaa)               6C	3

--------------------------------------------------
   JSR  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      JSR        $aaaa                 20	3

--------------------------------------------------
   LDA  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      LDA        #aa                   A9	2
      LDA        $aa                   A5	2
      LDA        $aa,X                 B5	2
      LDA        $aaaa                 AD	3
      LDA        $aaaa,X               BD	3
      LDA        $aaaa,Y               B9	3
      LDA        ($aa,X)               A1	2
      LDA        ($aa),Y               B1	2

--------------------------------------------------
   LDX  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      LDX        #aa                   A2	2
      LDX        $aa                   A6	2
      LDX        $aa,Y                 B6	2
      LDX        $aaaa                 AE	3
      LDX        $aaaa,Y               BE	3

--------------------------------------------------
   LDY  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      LDY        #aa                   A0	2
      LDY        $aa                   A4	2
      LDY        $aa,X                 B4	2
      LDY        $aaaa                 AC	3
      LDY        $aaaa,X               BC	3

--------------------------------------------------
   LSR  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      LSR        A                     4A	1
      LSR        $aa                   46	2
      LSR        $aa,X                 56	2
      LSR        $aaaa                 4E	3
      LSR        $aaaa,X               5E	3

--------------------------------------------------
   NOP  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      NOP                              EA	1

--------------------------------------------------
   ORA  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      ORA        #aa                   09	2
      ORA        $aa                   05	2
      ORA        $aa,X                 15	2
      ORA        $aaaa                 0D	3
      ORA        $aaaa,X               1D	3
      ORA        $aaaa,Y               19	3
      ORA        ($aa,X)               01	2
      ORA        ($aa),Y               11	2

--------------------------------------------------
   PHA  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      PHA                              48	1

--------------------------------------------------
   PHP  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      PHP                              08	1

--------------------------------------------------
   PLA  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      PLA                              68	1

--------------------------------------------------
   PLP  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      PLP                              28	1

--------------------------------------------------
   ROL  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      ROL        A                     2A	1
      ROL        $aa                   26	2
      ROL        $aa,X                 36	2
      ROL        $aaaa                 2E	3
      ROL        $aaaa,X               3E	3

--------------------------------------------------
   ROR  -
      Mnemonic   Mode d'adressage     Opcode	Taille
      
      ROR        A                     6A	1
      ROR        $aa                   66	2
      ROR        $aa,X                 76	2
      ROR        $aaaa                 6E	3
      ROR        $aaaa,X               7E	3

--------------------------------------------------
   RTI  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      RTI                              40	1

--------------------------------------------------
   RTS  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      RTS                              60	1

--------------------------------------------------
   SBC  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      SBC        #aa                   E9	2
      SBC        $aa                   E5	2
      SBC        $aa,X                 F5	2
      SBC        $aaaa                 ED	3
      SBC        $aaaa,X               FD	3
      SBC        $aaaa,Y               F9	3
      SBC        ($aa,X)               E1	2
      SBC        ($aa),Y               F1	2

--------------------------------------------------
   SEC  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      SEC                              38	1

--------------------------------------------------
   SED  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      SED                              F8	1

--------------------------------------------------
   SEI  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      SEI                              78	1

--------------------------------------------------
   STA  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      STA        $aa                   85	2
      STA        $aa,X                 95	2
      STA        $aaaa                 8D	3
      STA        $aaaa,X               9D	3
      STA        $aaaa,Y               99	3
      STA        ($aa,X)               81	2
      STA        ($aa),Y               91	2

--------------------------------------------------
   STX  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      STX        $aa                   86	2
      STX        $aa,Y                 96	2
      STX        $aaaa                 8E	3

--------------------------------------------------
   STY  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      STY        $aa                   84	2
      STY        $aa,X                 94	2
      STY        $aaaa                 8C	3

--------------------------------------------------
   TAX  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      TAX                              AA	1

--------------------------------------------------
   TAY  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      TAY                              A8	1

--------------------------------------------------
   TSX  -
      Mnemonic   Mode d'adressage     Opcode	Taille
      
      TSX                              BA	1

--------------------------------------------------
   TXA  -
      Mnemonic   Mode d'adressage     Opcode	Taille
      
      TXA                              8A	1

--------------------------------------------------
   TXS  -
      Mnemonic   Mode d'adressage     Opcode	Taille
      
      TXS                              9A	1

--------------------------------------------------
   TYA  -
      Mnemonic   Mode d'adressage     Opcode	Taille

      TYA                              98	1

	5. Interruptions:

Les interruptions sont des venements externes au processeur proprement dit qui proviennent des priphriques.
Pour vous donner une ide, lors d'une interruption, le cycle courant des instructions (du programme) est interrompu
quoiqu'il arrive pour executer le code correspondant  l'interruption.
Sur le 6502 il y a 3 type d'interruptions:

-On distingue d'abord les NMI, Non-Maskable Interrupts. Celles-ci ne peuvent pas tre dsactives par l'activation du flag I.
Pour la NES il s'agit surtout des interruptions provenant de la PPU (notamment Vblank). A l'appel de cette interruption 
on va xecuter la sous routine dont l'adresse se trouve dans la mmoire  $FFFA ($FFFA -> low,$FFFB -> high)
La mise  jour d'une NMI est effctu 60x/secondes(taux de rafraichissement d'un VBlank).
On peut s'en servir pour crire des donnes dans la PPU lors d'un VBlank (utilisation la plus couramment constate).
Ecrire des donnes en VRAM hors d'un VBlank n'est pas tellement grave sur un mulateur, mais est une source
de bugs invitable sur la console relle.

Les types d'interruptions suivants peuvent tre dsactivs en mettant le flag I du Processor Status  1:

-Il y a ensuite l'interruption RESET, qui est automatiquement xecute  la mise en marche du processeur.
L'adresse de la sous-routine de l'interruption RESET est en $FFFC ($FFFC -> low,$FFFD -> high).
Cette interruption etant automatiquement active au demarrage, l'adresse mise en $FFFC DOIT ABSOLUMENT ETRE LE DEBUT
DU PROGRAMME mme si le flag I est activ.

-Le dernier type d'interruption est soit le fait d'une execution d'une instruction BRK, ou requte d'interruption (IRQ)
de la part d'un priphrique cabl (cette dernire solution n'est pas trs importante sur NES et est souvent neglige).
Cpendant l'adresse pour la routine a utiliser est $FFFE. Son utilisation peut notamment tre occur par l'utilisation
du canal sonore DMC, voir dtails aprs.

Note: il faut imprativement utiliser l'instruction RTI pour terminer une routine qui a t appele par une interruption!
Note 2: les adresses sont supposes se trouver dans les banques de PRG-ROM, leur emplacement est invariable.

Avertissement: N'oubliez surtout pas que les interruptions peuvent survenir n'importe quand dans le programme.
Dans vos routines d'interruption, vous allez tre amen  modifier le contenu des registres, hors imaginons que
l'interruption arrive au moment o une sous routine est en cours d'execution dans le programme principal par
exemple, le rsultat serait que le programme sera fauss par l'execution de la routine de l'interruption.
Pour viter ce genre de dsagrment il suffit de sauvegarder le contenu des registres au debut de l'xecution
de la routine lie  l'interruption et de le restaurer  la fin.