
Vous tes dj arriv jusqu'ici?? Wow mes fliciations!!
Maintenant a risque de devenir un peu plus cors...


Fonctionnement de la PPU (Picture Processing Unit):
--------------------------------------------------

Petite intro:

Comprendre le fonctionnement de la PPU c'est un peu une manire de comprendre
comment une console fonctionne,  savoir dcharger le maximum de tches 
ses coprocesseurs. Dans le cas prsent de toute faon la NES a un fonctionnement
extrmement simple puisque la PPU est le seul vritable coprocesseur.

	1. Partage de la VRAM:

La NES dispose de 16 ko de mmoire video (et pas 32 ko comme on peut le voir souvent).
D'ailleurs n'essayez absolument pas de donner au registre d'adresse de la PPU
une adresse sur plus de 14 bits, car les $C000 octets suivants sont juste des
miroirs.
Cette mmoire est compltement ddie au fonctionnement de la PPU, et n'est pas
directement accessible par le processeur central. Par consquent, pour pouvoir
accder  cette mmoire, on dispose de toute une batterie de pseudo-registres qui
sont en fait utiliss tels des adresses en mmoire centrale. Ces pseudo-registres
permettent en fait de piloter la PPU pour l'affichage des sprites, faire des scrollings,
rgler les couleurs, ect...

Voil comment est partage la mmoire:
$0 -> $FFF	: Table des graphismes #0 (Pattern Table) d'une taille de $1000 (4096)
$1000 -> $1FFF  : Table des graphismes #1 d'une taille de $1000 (4096)
-> Remarque: si la rom  un mapper particulier (dfini dans l'header),
il y a moyen que ces tables de graphismes soient en fait 2 banques de la rom (CHR-ROM),
ou plus, ce sera expliqu plus loin avec l'utilisation du Multi-Memory Controller.
Quoi qu'il en soit ca n'affectera que les $2000 premiers octets de la VRAM.
$2000 -> $23BF	: Table de nommage #0 (Name Table) d'une taille de $3C0 (960)
$23C0 -> $23FF	: Table d'attribution #0 (Attribute Table) d'une taille de $40 (64)
$2400 -> $27BF	: Table de nommage #1 d'une taille de $3C0
$27C0 -> $27FF	: Table d'attribution #1 d'une taille de $40
$2800 -> $2BBF	: Table de nommage #2 d'une taille de $3C0
$2BC0 -> $2BFF	: Table d'attribution #2 d'une taille de $40
$2C00 -> $2FBF	: Table de nommage #3 d'une taille de $3C0
$2FC0 -> $2FFF	: Table d'attribution #3 d'une taille de $40
$3000 -> $3EFF	: Non utilis
$3F00 -> $3F0F	: Palette des images d'une taille de $10 (16)
$3F10 -> $3F1F	: Palette des sprites d'une taille de $10
$3F20 -> $3FFF	: Miroir des palettes d'une taille de $EO (224)

Au total $4000 octets soit 16384 octets.

Quelques dtails au niveau des miroirs utiliss dans la VRAM:
- les tables de nommage sont soumis  un effet de miroir, qui sera expliqu plus loin.
- mme chose pour les palettes.

	2. Tables des graphismes:

Il s'agit en fait d'abord d'expliquer comment sont stockes les donnes graphiques en
mmoire video. Les donnes sont organises en "tiles", de 8x8 pixels.
Pour chaque tile les couleurs sont codes sur 2 bits, ainsi pour chaque tile on a
besoin de $10 octets (16).
On se sert des 8 premiers octets pour code le premier bit de chaque pixel et du second
pour le deuxieme bit. Voil ce que a donne plus concrtement:

  Premier bit		Deuxime bit		Reprsentation de la tile

1. #00011000b -> $18  9. #10000001b -> $81	2 . . 1 1 . . 2
2. #01000010b -> $42 10. #00000000b -> $00	. 1 . . . . 1 .
3. #10100101b -> $A5 11. #00100100b -> $24	1 . 3 . . 3 . 1
4. #10000001b -> $81 12. #00000000b -> $00	1 . . . . . . 1
5. #01000010b -> $42 13. #00011000b -> $18	. 1 . 2 2 . 1 .
6. #01000010b -> $42 14. #00000000b -> $00	. 1 . . . . 1 .
7. #00111100b -> $3C 15. #00000000b -> $00	. . 1 1 1 1 . .
8. #00000000b -> $00 16. #00011000b -> $18	. . . 2 2 . . .

Donc la VRAM contient 2 tables des graphismes pouvant chacune contenir 256 tiles (4096 octets).
Soit un total de 512 tiles stockables possibles en mmoire.
Pour pouvoir les afficher on va avoir recours aux tables de nommage.

	3. Tables de nommage:

Les tables de nommage sont en fait des matrices de tiles, et vont constituer la base de l'affichage.
La NES a en effet un affichage de 32*30 tiles (soit en pixels 256*240).
Donc 32*30=960 soit la mmoire disponible pour une table de nommage. Chaque octet cod dans la table de nommage
sera un index vers une tile dans la table des graphismes.
Remarque: sur la version NTSC de la NES, les 8 premires et dernires lignes ne sont pas affiches.

	4. Tables d'attribution:

Le rle des tables d'attribution est complmentaire  celui des tables de nommage.
Comme vu prcedemment les couleurs des tiles sont codes sur 2 bits. Mais le systme de couleur
de la PPU permet un affichage en 16 couleurs, donc codage 4 bits.
Pour pouvoir accder  ces 16 couleurs on a recours aux tables d'attribution.
Voil comment ces tables fonctionnent:

-Chaque octet dans la table d'attribution retient les 2 bits de poids fort de chaque couleur
dans un groupe 4*4 tiles. Pour un groupe de 4 tiles on a ainsi 2 bits dans un octet de la table d'attribution.
On peut controler cette equivalence:
taille de la table d'attribution -> 64 octets
nombre de tiles stockables dans une table de nommage -> 960

Cela donne shmatiquement:
	octet de la table d'attribution #0
	33221100
	||||||+--------- tiles #0  #3
	||||+----------- tiles #4  #7
	||+------------- tiles #8  #B
	+--------------- tiles #C  #F

Remarque: le numero de tile #? ne correspond pas  l'index de la tile dans la table de nommage
	  car en ralit les couleurs ne sont pas attribues squentiellement mais par blocs de 4 tiles.
	

Complt avec les 2 bits de poids faibles situs dans la table des graphismes on obtient la couleur de la palette qui
sera alors affiche  l'cran.

	5. Fonctionnement des palettes:

La PPU utilise 2 palettes :
-la palette des images dstines  l'affichage des objets statiques d'arrire plan.
-la palette des sprites dstine comme son nom l'indique  l'affichage des sprites.

Chacune des palette  une taille de 16 octets. Il ne s'agit pas de relles valeurs RGB
mais une rfrence  une palette interne d'une varit de 52 couleurs possibles.
D'autre part les palettes ne sont pas rellement de 16 octets, car les adresses $3F00,
$3F04, $3F08 ect... tous les 4 octets renvois en fait  la mme couleur!
Une couleurs trs particulire car c'est elle qui va dfinir la transparence.
Ce qui limite la palette au nombre de couleurs effectif de 13 couleurs
Comme on dispose de 13 couleurs en ralit on peut en afficher jusqu'a 25 (une couleur tant commune aux 2 palettes)
 l'ecran en mme temps (fond d'cran + sprites)

Pour chaque octet de la palette voil comment proceder:
uullhhhh
||||||||
||||+----- 4 premiers bits -> dfini la valeur chromatique de la couleur: 
||||				-> attention cette valeur doit tre comprise entre 1 et C (12) (sinon -> couleur noire)
||||				-> mettre 0 permet d'afficher une nuance de gris selon la luminance choisie
||+------- ces 2 bits dfinissent la luminance, niveau de luminosit choisi
+--------- ces derniers bits ne sont pas utiliss

Voil les codes correspondant aux couleurs pour les valeur chromatiques:
$00 = gris		$05	= rose	$0A = vert
$01 = bleu clair	$06	= rouge	$0B = vert fonc
$02 = bleu cyan		$07	= ocre	$0C = bleu ardoise
$03 = bleu fonc	$08	= marron
$04 = violet		$09	= vert clair
Les niveaux de luminosit peuvent semblibement faire varier ces couleurs
Il existe un trs bon tableau pour voir chaque couleur associe  chaque code sur ce site:
http://www.sfu.ca/~ccovell/NESTechFAQ.html

	6. Fonctionnement des miroirs:

En ralit la VRAM de la NES dispose d'assez de mmoire pour seulement 2 tables de nommage et 2 tables d'attribution.
Il en rsulte que 2 tables sont en fait des "miroirs" des 2 autres tables.
Chaque entre dans une table est automatiquement alors faites dans l'autre.

On dispose de 3 modes pour les miroirs (ils sont dfinis dans l'header pour une rom) : 
-le premier mode dsactive simplement cet effet, et autorise l'utilisation d'une seule table de nommage (et d'attribution).
-le second mode, le mode "horizontal", permet d'utiliser les tables #0 et #2, la table #1 est un miroir de la table #0
et la table #3 est un miroir de la table #2.
-le dernier mode, le mode "vertical", permet d'utiliser les tables #0 et #1, la table #2 est un miroir de la table #0
et la table #3 est un miroir de la table #1.

Les palettes aussi disposent de miroirs, et chaque intervalle  partir de l'adresse $3F20 jusqu'a $3FFF sont des miroirs
respectifs des 2 palettes tous les $10 octets (16).

	7. Scrolling de l'arrire plan:

Comme toute bonne console la NES dispose d'une fonction de scrolling cable en hardware, ce qui permet un scrolling
irrprochable, contrairement  ce que l'on peut obtenir sur un PC.
Etant donne qu'une table de nommage quivaut  la taille d'un ecran, il va falloir utiliser la deuxieme table de
nommage  notre disposition.
On peut faire scroller l'arrire plan sur 2 axes seulement: horizontalement et verticalement.
La rsolution est de toute facon de 256*240.
Voila shmatiquement ce que l'on obtient:

Horizontal:					Vertical:
	0		   512 -> 256*2		+---------+0
	+---------+---------+			| 	  |
	|	  |	    |			|    A    |
	|    A	  |    B    |			|	  |
	|	  |	    |			+---------+
	|	  |	    |			|         |
	+---------+---------+			|    B	  |
						|	  |
						+---------+480 -> 240*2

Pour dfinir quelle table de nommage on utilise pour "A" on a recours aux bits 0 et 1 du registre $2000 qui sera expliqu
plus loin. Logiquement "B" sera l'autre table de nommage.
Le type de miroir utilis est dfini dans l'header:
Horizontal: Table #0 -> Miroir Table #1
		Table #2 -> Miroir Table #3 
Vertical:   Table #0 -> Miroir Table #2
		Table #1 -> Miroir Table #3 

Le shma pour le scrolling des tables est le suivant:

	Table de nommage #2		Table de nommage #3


	Table de nommage #0		Table de nommage #1

L'utilisation du scrolling s'effectue par l'criture successive de valeurs 8 bits dans le registre $2005.
La premire valeur ecrite correspond au scrolling vertical, par consquent elle doit tre imprativement
infrieure ou gale 239 (du fait de la limitation de la rsolution de la NES).
La seconde valeur crite juste aprs correspond au scrolling horizontal.

	8. Fonctionnement des sprites:

La PPU dispose de capacits particulires pour la gestion des sprites. Cela va permettre de simplifier l'affichage
de sprites  l'cran puisqu'ils seront compltement independant de l'arrire plan sur lequel ils vont apparaitre.

Il y a une mmoire incluse permettant de stocker les informations de 64 sprites, qui peuvent tre d'une taille de 8*8
ou 8*16 pixels (8->largeur, 16->longueur). Les donnes des sprites sont contenues dans la table des graphismes.
Pour permettre le stockage de ces informations la NES dispose d'un espace mmoire compltement indpendant de la
VRAM et de la mmoire centrale. Cette mmoire est de 256 octets,  raison de 4 octets par sprite (donc capacit pour 64).

-----------------------------------------------------
Pour un sprite:
	-Octet 0 -> Coordonne Y du point o le sprite se trouve, c'est  dire l'ordonne.
		    Ce point est le point du coin haut-gauche du sprite:
				
			point	->+-------+
				  |	  |
				  |	  |
				  |	  |
				  +-------+

	-Octet 1 -> Il s'agit de l'index dans la table des graphismes des donnes du sprite.
		    S'utilise de la mme faon que la table de nommage.
		    Attention les sprites en 8*16 ont une particularit -> voir plus bas.

	-Octet 2 -> Cet octet contient une srie de flags qu'il convient d'expliciter:
			vhp000cc -> octet divis par flags

			flag v: Flip Vertical -> mis  1 active le flip vertical (mouvement rapide), sinon dsactiv.
			flag h: Flip Horizontal -> mme chose horizontalement.
			flag p: Priorit d'arrire-plan -> mis  1 si le sprite doit tre cach derrire, sinon laisser  0.
			flag 0: Inutilis
			flag c: Les 2 bits de poids forts de la couleur, car on ne dispose pas ici des tables d'attributions...
				Ce flag fonctionne comme les tables d'attribution (voir prcdemment).

	-Octet 3 -> Coordonne X du point o le sprite se trouve, c'est  dire l'abcisse.

-----------------------------------------------------

L'utilisation des sprites d'une taille de 8*16 est diffrente car leur taille fait le double d'une tile normale (8*8).
Par consquent l'adressage par le biais de l'octet d'index dans une valeur de sprite sera interprt diffrement
et on accedera ainsi soit  la premire table des graphismes (Pattern #0  l'adresse en VRAM $0000) ou bien
 la seconde table des graphismes (Pattern #1  l'adresse en VRAM $1000).

On peut uniquement afficher 8 sprites  la fois sur une "ligne" (scanline), c'est  dire si les sprites ont 
les mmes coordonnes en abcisse(X). Techniquement la PPU peut cependant difficilement grer plus de sprites que cela.

	9. VBlank et HBlank:

VBlank est pour Vertical Blanking, et HBlank pour Horizontal Blanking. Le blanking c'est le scintillement emis par
chaque projection de pixels par le cannon  electrons sur l'cran. La PPU a comme chaque priphrique d'affichage de
console un taux de rafraichissement. Ce taux est de 60 hertz (60x/secondes) pour une NES NTSC et 50 hertz pour une PAL.

Shmatiquement le cannon  lecron va ecrire sur la TV les lignes de gauche  droite et une fois arriv au bout de
la ligne il doit revenir  gauche pour ecrire la ligne suivante -> cette priode est appele HBlank.

Une fois tout l'cran complt il doit revenir tout en haut de l'cran pour procder  l'affichage de l'cran suivant.
Cette priode est appel VBlank.

On peut voir si la PPU est en priode de VBlank en controlant le bit #7 du registre $2002(il est alors  1), tout comme 
on peut mettre celui ci  zero. Celui ci est remis  0  la fin du VBlank.

Le bit #6 du registre $2002 est appel Hit Flag, et sert a controler  l'affichage d'un sprite quand
est-ce que l'on va ecrire la premire ligne du sprite (il sera alors mis  1). Si la coordonne en ordonne (Y)
du sprite est 12, ce flag sera mis  1 lors de l'criture de la ligne 12. Il est automatiquement remis  0
lors du VBlank.

On utilise souvent le contrle du VBlank comme un timer,  dfaut d'y avoir une quelquonque horloge sur la NES.

Fonctionnement des autres peripheriques:
---------------------------------------

	1. Pseudo-Audio Processing Unit:

Comme son nom l'indique la Pseudo-Audio Processing Unit (pAPU) permet  la NES de sortir du son.
Le "Pseudo" vient du fait qu'en ralit il n'existe pas de vritable composant indpendant ayant en charge
le traitement du son ( la diffrence de la SUPERNES et de son SPC700).
Le son est en fait trait directement par le processeur et une srie de composants de base, les synthses
tant transmises par des registres commands directement depuis le processeur.

La NES dispose de 4 voix de synthses FM et une voix pour le son digital (PCM).
Parmi les voies de synthses, on compte 2 voix de rythme (pulse), une voix de triangle, et
un canal de bruit.

Les voix de rythme ont la possibilit de produire du son dans les frquences de 54,6 Hz  12,4 Khz.
Il y a possibilit de rgler la frquence de sifflement et la dure du cycle.

La voix de triangle peut produire du son entre les frquences 27.3 Hz et 55.9 Khz dans une
rsolution de 4-bits (donc 16 tonalites diffrentes). Ce canal dispose d'un compteur linaire
ce qui permet de le dsactiver aprs une certaine priode d'utilisation.

Le canal de bruit lui a la facult de produire des sons  des frquences alatoires entre 29.3 
Hz et 447 KHz. On peut l'utiliser pour produire des nombres alatoires en sortie du canal (utile
pour les jeux).

Fonctionnement du canal digital (DMC):
Le canal DMC rpond  un fonctionnement bien particulier en comparaison des autres canaux sonores de la pAPU.

	3. Joypads

Je ne m'interesserais ici qu'au fonctionnement des 2 joypads de base. Les autres priphriques pourraient
ventuellement tre interessants au cas o vous travaillerez sur un mulateur, auquel cas le contenu de
cette documentation se rvelerait bien insuffisante.

La NES supporte donc 2 joypads  la fois (ou un joypad et le Zapper, le pistolet  laser).
Ces 2 joypads correspondent respectivement aux registres $4016 et $4017. Le fonctionnement
des joypads est particulier en comparaison des autres registres de priphrique.
Pour pouvoir utiliser ces registres ont doit d'abord les remettre  l'tat initial
en crivant successivement 1 puis 0 dans le registre adquate.
Ensuite on doit ralis le nombre de lecture ncessaire pour accder  la touche
qui nous interesse de vrifier qu'elle a t prss.
Nombre de lectures dfini comme suit:

Pour chaque registre (soit $4016 ou $4017):
$4016:

Joypad #1	Joypad #3 (*)
1 -> A		9 -> A		17 ->----+ 
2 -> B		10 -> B		18 ->    |___ ces 4 valeurs sont utilises pour
3 -> SELECT	11 -> SELECT	19 ->    |    dfinir quel manette est connecte ("signature")
4 -> START	12 -> START	20 ->----+
5 -> HAUT	13 -> HAUT	21 -> 0
6 -> BAS	14 -> BAS	22 -> 0
7 -> GAUCHE	15 -> GAUCHE	23 -> 0
8 -> DROITE	16 -> DROITE	24 -> 0

* ->    le joypad #3 est ici uniquement possible si on utilise l'adaptateur 4 manettes.
	Pareil pour le registre $4017, le Joypad #1 quivaut au Joypad #2
	"	"	"	"    , le Joypad #3 quivaut au Joypad #4
	Si on utilise pas l'adaptateur 4 manettes les valeurs 9  16 sont inutiles.

Imaginons que nous devions voir si la touche SELECT a t prsse sur le joypad #2,
on aura alors le code assembleur suivant:

LDA #$01  --|
STA $4017   |---> remise  0 du port #2
LDA #$00  --|
STA $4017
LDA $4017 --|
LDA $4017   |---> 3 lectures pour SELECT
LDA $4017 --|
AND #$01  ------> on ne rcupre que le bit #0 (voir details dans "Dtails sur les registres de periphriques")

Si la valeur contenue dans l'accumulateur est  1 alors la touche SELECT a t coche.

Signature:
On peut vrifier en effectuant un certain nombre de lecture (17)
le nombre de joypads connects. Ainsi on procde comme suit:
%0000 -> aucun joypad ou priphrique connect
%0001 -> joypad connect au port #1 ($4016)
#0010 -> joypad connect au port #2 ($4017)
Remarque: les 4 bits correspondent aux valeurs de 17  20.
On obtient cette valeur aprs 17 lectures dans le registre $4016 ou $4017

C'est a peu prs tout ce qu'il faut savoir pour les joypads. D'autres types de priphriques d'entre ont
un fonctionnement lgrement diffrent cependant ils utilisent quoi qu'il arrive les ports $4016 et $4017.


Dtails sur les registres de periphriques:
------------------------------------------

On a pas directement accs aux priphriques comme la PPU ou bien les joypads, il faut trouver en moyen  partir de la
programmation du processeur central pour piloter ces priphriques. Pour cela on utilise une srie de pseudo-registres
qui sont en fait des adresses mmoire. Ces adresses sont donnes en 16 bits.
Selon le priphrique on va devoir ecrire (cas de la PPU) ou bien lire (gnralement pour la pAPU).
On va aussi devoir parfois proceder a une ecriture successive de 2 valeurs.


	1. Registres PPU:


+--------------------------------------------------------------------------------------------------------+
|Registre $2000: Registre de contrle de la PPU #1 (Ecriture seulement)
|		masque: vmsbpiNN
|	
|		v = Mis  1 ce bit xecute automatique une routine NMI (Non Maskable Interrupt) lors d'un VBlank
|		    Rappel: l'adresse de cette routine se trouve en $FFFA dans la PRG-ROM.
|
|		m = Selection PPU
|			Positionn  Maitre  0, Esclave  1. (inutilis apparament)
|
|		s = Taille des sprites
|			Si le bit est  0 -> sprites en 8x8 (taille standard d'une tile)
|			"	"	" -> sprites en 8x16
|
|		b = Adresse de la table des graphismes utilise pour l'arrire plan en VRAM
|			0 = $0000
|			1 = $1000
|
|		p = Adresse de la table des graphismes utilise pour les sprites en VRAM
|			0 = $0000
|			1 = $1000
|
|		i = Incrmentation d'adresse PPU
|			0 = incrmentation de 1
|			1 = incrmentation de 32
|
|		NN = Adresse de la table de nommage (Name Table) utilise en VRAM
|			00 = $2000
|			01 = $2400
|			10 = $2800
|			11 = $2C00
+--------------------------------------------------------------------------------------------------------+
|Registre $2001: Registre de contrle de la PPU (Ecriture seulement)
|		masque: fffvVsbt
|			
|			fff = Couleur de teint utilise par defaut ("Colour Emphasis")
|				000 = Noir (pas de teint)
|				001 = Rouge
|				010 = Bleu
|				100 = Vert
|			Remarque: ce n'est pas encore correctement mul sur certains mulateurs.
|
|			v = Visibilit des sprites (mettre  1 par dfaut pour pouvoir afficher des sprites)
|
|			V = Visibilit de l'arrire plan (mettre  1 par dfaut pour pouvoir afficher l'arrire plan)
|
|			s = Clipping des sprites
|				0 = les sprites ne sont pas affichs sur les 8 pixels gauches
|				1 = pas de clipping
|
|			b = Clipping de l'arrire-plan
|				0 = l'arrire-plan n'est pas affich sur les 8 pixels gauches
|				1 = pas de clipping
|
|			t = Type d'affichage
|				0 = affichage couleur
|				1 = affichage noir et blanc
+--------------------------------------------------------------------------------------------------------+
|Registre $2002: Registre de Status de la PPU (Lecture seulement)
|		masque: vhsw---- (-> 4 bits de poids faibles non utiliss)
|
|			v = Priode de VBlank
|				Ce bit est mis  1 durant une priode de VBlank.
|				Il est mis  0 ds qu'on fait une lecture de ce registre pour
|				viter de rexecuter une routine dans un mme VBlank.
|			Remarque: trs utile pour s'en servir comme timer.
|
|			h = Occurence Sprite #0
|				Ce bit est mis  1 ds que le VBlank  atteint la position
|				du sprite #0 (du moins le premier pixel non transparent).
|				Il est mis  0 aprs chaque VBlank.
|			Voir l'excellente FAQ de Chris Covell pour en savoir d'avantage.
|				
|			s = Compteur de sprites par ligne
|				0 = 8 ou moins de 8 sprites par ligne
|				1 = plus de 8 sprites par ligne
|
|			w = Flag d'ecriture en VRAM
|				Ce bit mis  1 indique que la PPU ignore les ecritures faites en VRAM.
|
|			Remarque: Utilisez ce registre SYSTEMATIQUEMENT pour ecrire des donnes en VRAM.
|			Il n'est pas conseill d'ecrire des donnes hors d'un VBlank durant l'execution.
+--------------------------------------------------------------------------------------------------------+
|Registre $2003: Registre d'adresse en SPR-RAM (Ecriture seulement)
|		
|		Permet d'crire l'adresse 8 bits utilise par le registre $2004
|		pour accder  une case mmoire en SPR-RAM.
+--------------------------------------------------------------------------------------------------------+
|Registre $2004: Registre d'entre-sortie en SPR-RAM (Lecture-Ecriture)
|
|		Permet d'crire ou de lire la case d'adresse dfinie par le registre $2003.
+--------------------------------------------------------------------------------------------------------+
|Registre $2005: Registre de Scrolling d'arrire-plan (Ecriture seulement)
|		
|		L'utilisation de ce registre se fait par 2 critures successives.
|		
|			1re valeur: Scrolling horizontal
|			2me valeur: Scrolling vertical
|		Voir la partie sur les scrollings pour plus d'informations
+--------------------------------------------------------------------------------------------------------+
|Registre $2006: Registre d'adresse VRAM (Ecriture seulement)
|
|		Il s'agit de l'adresse en VRAM que va utiliser le registre $2007.
|		L'criture dans ce registre doit s'effectuer par 2 critures successives
|		tant donn la limitation des bus  8 bits encore une fois.
|
|			1re valeur: 8 bits de poids fort de l'adresse
|			2me valeur: 8 bits de poids faible de l'adresse
|
|		REMARQUE: Attention  l'incrmentation d'adresse PPU! A chaque ecriture dans le registre
|		$2007, l'adresse du registre $2006 est incrmente soit de 1 ou de 32 (selon le registre PPU #1)
+--------------------------------------------------------------------------------------------------------+
|Registre $2007: Registre d'entre-sortie en VRAM (Lecture-Ecriture)
|
|		C'est le registre d'accs  la PPU le plus utilis.
|		C'est par celui ce que vont passer toutes les ecritures pour les tables des graphismes,
|		de nommage ou d'attribution, bref toutes les donnes contenues en VRAM.
|		Il s'utilise de paire avec le registre $2006 qui dfini l'offset en VRAM.
+--------------------------------------------------------------------------------------------------------+


Gardez  l'esprit que tous les transferts sont effctus en 8 bits, ce qui inclue de nombreuses boucles si vous
avez des donnes consquentes  copier. Ainsi pour la SPR-RAM une autre solution gagne en facilit, expliqu
juste en dessous.

Registre spcial:
Pour accder  la SPR-RAM on dispose d'une autre alternative qui facilite grandement les transferts car il
permet de copier un bloc fixe de 256 octets de donnes qu'on aurait par exemple stock en RAM ou en PRG-ROM.
Il s'agit d'un registre DMA (Direct Memory Access) semblabe  ceux utiliss pour le son digital.
Ce registre est  l'adresse $4014.
La formule est simple:
$100 * (oprande stocke dans le registre $4014) = adresse de dbut du bloc de 256 octets ($100)

Il est conseill d'utiliser ce registre pour amliorer les performances du programme.

	2. Registres pAPU





+--------------------------------------------------------------------------------------------------------+
|Registre $4000: Registre de contrle #1 de la voix de rythme #1 (Ecriture seulement)
|		
|		masque:%ccvessss
|			||||+---- Taux d'echantillonage en lecture
|			|||+----- Selection d'envellope (0 = varie, 1 = fixe)
|			||+------ Vague maintenue: rption automatique (0 = non, 1 = oui)
|			+-------- Accomplissement du cycle
|					00 = 87,5 %
|					00 = 75,0 %
|					00 = 50,0 %
|					00 = 25,0 %
+--------------------------------------------------------------------------------------------------------+
|Registre $4001: Registre de contrle #2 de la voix de rythme #1 (Ecriture seulement)
|
|		masque:%fsssmrrr
|			|||||+--- talement de la frquence: 0 est le minimum, 7 le maximum 
|			|||||		Remarque: voir selon bit #3 pour basse ou haute frquence
|			||||+---- mthode de frquence (0 -> de haut vers bas, 1-> de bas vers haut)
|			|+------- vitesse de changement de frquence
|			+-------- frquence de sifflement
|				0 -> les bits #0  #6 sont ignors
|				1 -> les bits #0  #6 sont pris en compte
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4002: Registre de frquence #1 de la voix de rythme #1 (Ecriture seulement)
|
|		Note: la frquence des voix de rythme sont tales sur 11 bits.
|		      Ce registre permet de dterminer la valeur des 8 bits de
|		      poids faible de la frquence.
|
|		masque:%ffffffff -> 8 bits de poids faible de la frquence
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4003: Registre de frquence #2 de la voix de rythme #1 (Ecriture seulement)
|		
|		masque: %tttttfff
|			 |||||+--- les 3 bits de poids fort de la frquence de la voix de rythme #2
|			 +-------- temps d'activit de la voix
+--------------------------------------------------------------------------------------------------------+
|Registre $4004: Registre de contrle #1 de la voix de rythme #2 (Ecriture seulement)
|
|			Son fonctionnement est identique  la voix de rythme #1 (voir registre $4000)
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4005: Registre de contrle #2 de la voix de rythme #2 (Ecriture seulement)
|
|			Son fonctionnement est identique  la voix de rythme #1 (voir registre $4001)	
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4006: Registre de frquence #1 de la voix de rythme #2 (Ecriture seulement)
|
|			Son fonctionnement est identique  la voix de rythme #1 (voir registre $4002)	
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4007: Registre de frquence #2 de la voix de rythme #2 (Ecriture seulement)
|
|			Son fonctionnement est identique  la voix de rythme #1 (voir registre $4003)	
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4008: Registre de contrle #1 de la voix de triangle (Ecriture seulement)
|
|		masque:%vccccccc
|			|+------- compteur linaire de chargement du registre (voir prcision prcedemment)
|			+-------- 0 = longueur d'horloge dsactiv
|				  1 = dmarrage linaire du compteur
+--------------------------------------------------------------------------------------------------------+
|Registre $4009: Registre de contrle #2 de la voix de triangle (Ecriture seulement)
|
|		Ce registre n'est pas utilis.
|
+--------------------------------------------------------------------------------------------------------+
|Registre $400A: Registre de frquence #1 de la voix de triangle (Ecriture seulement)
|
|		Note: la frquence de la voix de triangle s'tale sur 11 bits.
|		      Ce registre permet de dterminer la valeur des 8 bits de
|		      poids faible de la frquence.
|
|		masque:%ffffffff -> 8 bits de poids faible de la frquence
|
+--------------------------------------------------------------------------------------------------------+
|Registre $400B: Registre de frquence #2 de la voix de triangle (Ecriture seulement)
|		
|		masque: %tttttfff
|			 |||||+--- les 3 bits de poids fort de la frquence de la voix de triangle
|			 +-------- temps d'activit de la voix
+--------------------------------------------------------------------------------------------------------+
|Registre $400C: Registre de contrle #1 du canal de bruit (Ecriture seulement)
|		
|		masque:%00vessss
|			||||+---- Taux d'echantillonage en lecture
|			|||+----- Selection d'envellope (0 = varie, 1 = fixe)
|			||+------ Vague maintenue: rption automatique (0 = non, 1 = oui)
|			+-------- Non utiliss
+--------------------------------------------------------------------------------------------------------+
|Registre $400D: Registre de contrle #2 du canal de bruit (Ecriture seulement)
|
|		Ce registre n'est pas utilis.
|
+--------------------------------------------------------------------------------------------------------+
|Registre $400E: Registre de frquence #1 du canal de bruit (Ecriture seulement)
|
|		Note: la frquence du canal de bruit s'tale sur 11 bits.
|		      Ce registre permet de dterminer la valeur des 8 bits de
|		      poids faible de la frquence.
|
|		masque:%ffffffff -> 8 bits de poids faible de la frquence
|
+--------------------------------------------------------------------------------------------------------+
|Registre $400F: Registre de frquence #2 du canal de bruit (Ecriture seulement)
|		
|		masque: %tttttfff
|			 |||||+--- les 3 bits de poids fort de la frquence du canal de bruit
|			 +-------- temps d'activit de la voix
+--------------------------------------------------------------------------------------------------------+
|Registre $4010: Registre de contrle du canal de son digital (DMC) (Ecriture seulement)
|
|		masque:%i???ssss
|			||||+---- frquence d'chantillonage utilise
|			|+------- fonction inconnue
|			+-------- gnre une interruption de type IRQ  l'execution (peut tre masque)
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4011: Registre du volume du canal de son digital DMC (Ecriture seulement)
|
|		Les 8 bits sont utiliss pour dfinir le volume du canal.
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4012: Registre d'adresse des donnes digitales du canal DMC (Ecriture seulement) 
|
|		Ces 8 bits dtermine l'endroit o on doit lire les donnes pour
|		le canal DMC.
|		Les donnes seront lues dans la 2me banque de PRG-ROM, c'est  dire de $C000  $FFFF.
|		La formule pour trouver l'adresse est la suivante:
|		((valeur 8 bits stocke dans $4012) * 64) + $C000
|		Rappel: 64 = $40
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4013: Registre de longueur des donnes digitales (Ecriture seulement)
|
|		Dfinit la longueur de l'chantillon digital  lire  l'adresse $4012
|		La formule pour calculer sa taille est:
|		((valeur 8 bits stocke dans $4013) * 16) + 1
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4014: Registre d'accs direct  la mmoire (DMA) SPR-RAM (Ecriture seulement)
|
|		Voir PPU - Registre spcial.
|
+--------------------------------------------------------------------------------------------------------+
|Registre $4015: Registre d'tat de la PPU (Lecture-Ecriture)
|
|		En lecture, ce registre  seulement une fonction:
|		Seul le bit #0 est important, si il est  1 c'est que la PPU est en cours d'utilisation
|
|		En criture:
|		masque:%000edcba
|			|||||||+- voix de rythme #1 (0 = dsactive, 1 = active)
|			||||||+-- voix de rythme #2 (0 = dsactive, 1 = active)
|			|||||+--- voix de triangle (0 = dsactive, 1 = active)
|			||||+---- canal de bruit (0 = dsactive, 1 = active)
|			|||+----- canal digital (0 = dsactive, 1 = active)
|			+-------- bits non utiliss
|
|
+--------------------------------------------------------------------------------------------------------+

Les registres de contrle des canaux sonores servent juste  configurer les canaux (gnralement ceci est fait
une seule fois avant de jouer la chanson). Les "notes" sont envoyes par le biais des registres de frquences
avec la frquence utilise ainsi que la dure.
Le mieux que je puisse vous conseiller c'est de tester ces canaux et d'essayer d'implmenter des partitions
rcupres dans des fichiers NSF. Il existe de nombreuses documentations qui expliquent comment procder. Il
existe galement un logiciel sur le site NES Development permettant facilement d'crire une musique et de
l'implmenter ensuite dans une rom.


	3. Registres Joypads


+--------------------------------------------------------------------------------------------------------+
|Registre $4016: Registre de contrle du Joypad #1 (Lecture-Ecriture)
|
|		En lecture:
|		%???zteed
|		 |||||||+----- donne du joypad (voir dtails priphriques)
|		 |||||+------- lire des donnes du port d'expansion (utilis par certains priphriques)
|		 ||||+-------- indique la gachette du Zapper a t prsse
|		 |||+--------- indique qu'un sprite se trouve devant le viseur du Zapper
|		 +------------ utilisation inconnue
|
|		En criture:
|		%?????ees
|		 |||||||+----- Mise  jour tat des touches du joypad (ncessaire pour lecture des touches)
|		 |||||||         0 = efface l'tat
|		 |||||||	 1 = reset l'tat
|		 |||||||		Voir dtails prcedemment.
|		 |||||+------- criture de donnes dans le port d'expansion
|		 +------------ utisation inconnue
+--------------------------------------------------------------------------------------------------------+
|Registre $4017: Registre de contrle du Joypad #2 (Lecture-Ecriture)
|
|			Son fonctionnement est identique  celui du registre prcedent.
|
+--------------------------------------------------------------------------------------------------------+


Autres choses utiles:
--------------------

	1. Structure iNes:

Ici ne sera abord que la structure iNes, qui utilise un header de 16 octets des fichiers .NES.
Cet header ne fait pas vraiment parti de la rom mais contient des informations indispensables
 son fonctionnement pour un emulateur (notamment si on utilise un mapper particulier).
C'est un standart de fait et il existe d'autres formats (voir meilleurs).

L'header iNes est de 16 octets($10):

Adresse	|Taille	|Contenu
	|	|
0	|3	|Contient les 3 caractres ASCII 'NES'
	|	|
3	|1	|Contient la valeur $1A
	|	|
4	|1	|Nombre de pages de PRG-ROM de 16 ko dans la rom
	|	|
5	|1	|Nombre de pages de CHR-ROM de 8 ko dans la rom
	|	|
6	|1	|Octet de controle de la ROM #1:
	|	|masque: %mmmmvtsm
	|	|	  |||||||+-- Miroir utilis en VRAM (0=horizontal,1=vertical)
	|	|	  ||||||+--- utilisation de SRAM ou non pour les sauvegardes (1=oui)
	|	|	  |||||+---- presence d'un trainer de 512 octets
	|	|	  ||||+----- Possibilit d'utiliser 4 Name Table indpendantes en VRAM
	|	|	  +--------- 4 bits de poids faible du mapper utilis
	|	|
7	|1	|Octet de controle de la ROM #2:
	|	|masque: %mmmm0000
	|	|	  ||||+------ ces 4 bits sont toujours  0
	|	|	  +---------- 4 bits de poids faible du mapper utilis
	|	|
	|	|
	|	|Remarque: les octets suivants sont ignors par la plupart des mulateurs et doivent rester  0
---------------------------------------------------------------------------------------------------------------

Normalement il est d'usage de faire suivre le code (PRG-ROM) juste aprs l'header.
Les pages CHR-ROM suivront donc logiquement et seront automatiquement charges dans 
les tables des graphismes. L'utilisation de la CHR-ROM annihile toute possibilit
d'crire dans la VRAM de $0000  $2000 sous peine de provoquer une erreur de bus,
cette mmoire tant dornavant considre comme en disponible en lecture seule.
On peut ne mettre le code qu'en utilisant que la deuxime page galement.
Si vous utilisez +de 2 page de PRG-ROM et +de 2 pages de CHR-ROM il vous
faudra utiliser un mapper.
Si vous n'utilisez qu'une page de PRG-ROM il s'agit toujours de la page commenant en $C000.

	2. Multi-Memory Controler:

L'utilisation du Multi-Memory Controller est indispensable pour obtenir une taille de rom >40 ko.
Son utilisation va de paire avec ce que l'on appele un mapper. Le mapper utilis est dfini dans l'header.
Son support par les mulateurs fut longtemps un problme. Il n'y aura pas beaucoup de dtails sur cette
partie car la mmoire disponible en standard par une rom est largement suffisante pour une dmo.

Tous les mappers sont dtaills  cette adresse:

http://free.prohosting.com/~nintendo/mappers.nfo


Dtails sur les mthodes d'assemblage:
-------------------------------------

La NES est une machine trs ancienne et relativement limite, nanmoins en assembleur il est possible de tirer d'une
machine de nombreuses ressources puisque l'on travaille directement avec le matriel.
Mais il convient alors t'integrer des mthodes de programmation particulires, ainsi que d'autres propres
au systme proprement dit.

Il ne faut surtout pas hsiter  mnager la mmoire disponible en utilisant abondamment le masquage de bit pour les
valeurs ne ncssitant pas beaucoup de combinaisons. C'est  dire utiliser un octet pour dfinir sur des plages de
bits (flags) des valeurs.
	
	On peut procder ainsi:

Si le monstre reponds masque suivant:
           ____________
           |    |   | |
            bbbb bbb b
              |   |  +---- bit de vrification d'activation du monstre
              |   +------- flag de 3 bits pour la vie du monstre
              +----------- flag de 4 bits pour le type de monstre

	;on veut coder un monstre
	;le nombre maximum de point de vie possible pour un monstre dans mon jeu est 3
	;il y a 15 monstres diffrents et on doit aussi avoir une valeur pour voir si il est actif ou non
	LDA monstre_1
	AND #$F0
	LSR A
	LSR A
	LSR A
	LSR A
	PHA
	JSR type_monstre ;routine pour identifier le monstre
	LDA monstre_1
	AND #$0E
	LSR A
	PHA
	JSR degats_monstre



Sur NES notamment, on ne dispose pas d'horloge intgr comme sur un micro-ordinateur (du moins  partir de 1990 la plupart
en ont t quip). Par contre pour palier  ce dfaut, on peut utiliser le signal VBlank cabl en hardware rpondant
 partir d'un registre particulier et d'un routine d'interruption.
Deux moyens rpondant toutes deux  des besoins diffrents. Il faut savoir que sur la NES relle crire en mmoire vido
hors que lors du droulement du VBlank est une source de bug innrante. Par consquent on est oblig de s'imposer une
certaine rigueur de programmation. Rigueur qui n'est pas obligatoirement reproductible lorsque l'on n'a comme seul moyen
de test un mulateur.

Il existe 2 moyens pour utiliser le VBlank:
-soit activer le bit #7 du registre $2000 de la PPU pour generer automatique une interruption non masquable et donc
appeler la sous routine d'adresse dfinie par le vecteur situ en $FFFA. Ceci fait vous pouvez placer absolument tout
le code que vous voulez du moment que ca n'excede pas la dure du VBlank en xecution qui est d'environ 16 millisecondes.
Ca suffit normalement pour placer une quantit de code relativement suffisante.
Il faut bien raliser que cette routine sera xcut 60x par seconde (pour une machine NTSC, par dfaut sur la plupart
des mulateurs).

-l'autre moyen c'est de controler lorsqu'un VBlank survient par le biais du bit #7 du registre $2002. Il suffit de crer
une routine qui boucle indfinimment tant que cette condition n'est pas satisfaite. Normalement cela ne pose pas de problme.
Attention si vous utilisez galement les NMI ainsi que cette mthode car la NMI sera toujours satisfaite d'abord et
ensuite uniquement votre routine sera xecut.
En outre aprs la lecture du registre $2002 le bit #7 sera automatiquement remis  0. Un dtail qui a une importance
majeure puisqu'il va viter de rexecuter une seconde fois la routine, ce qui fausserait compltement le programme.



Epilogue:
--------

Je tiens  remercier tous les auteurs des documentations dj disponibles en anglais, notamment Y0shi, Chris Covell 
dont la plupart de ce document  t constitu, ainsi que la plupart des auteurs de documentations disponibles 
sur l'excellent site NES Development: http://nesdev.parodius.com.
Sans eux rien n'aurait t possible.
Je tiens galement  remercier ceux qui vont utiliser et distribuer ce document, et j'encourage vivement ce type
d'initiatives. J'spre sincrement qu'il vous sera utile autant qu'il m'a t agrable de l'crire.

Dtails et remarques: crispysix@wanadoo.fr

------------------------- c'est ------------------ termin ---------------------------

