## Invader NES

A l'ère de l'IA où des milliers d'ordinateur ingurgitent sans cesse des millions de gigaoctet,
il est parfois intéressant d'explorer comment les choses se faisait à une époque où la puissance 
de calcul se limitait à seulement 4ko de RAM et les programmes ne pouvait dépasser 40ko.

Quoi de mieux pour se faire que de tenter de porter un jeu initialement développé en flash
"Terrorist Invader" sur la NES. Morale de l'histoire, c'est pas évident!

Le projet est toujours en WIP mais nous avons tout de même un décors et un camion qui peut se 
déplacer de gauche à droite. Seulement voilà nous ne pouvons qu'afficher 64 sprites à l'écran en 
même temps. Cela semble somme toute une quantité généreuse, ça l'est, mais le jeu contien des 
éléments assez gros et une bonne partie des sprites alloué ne sont utilisé que pour le camion. 
Il ne m'en resterait très peu pour les hélicoptères. Et c'est là que le projet à été mis sur pause.

## Piste de solution

La NES a une fonctionnalité qu'on appelle le zero sprite interrupt. Il s'agit d'une interruption
qui est généré lorsque le raster, le faiseau d'electron sur les vieux téléviseur à écran cathodique,
atteint la position du sprite zero. Cela nous permettrait d'avoir une partie de l'écran qui scroll
à une vitesse regulière et où les hélicoptères serait placé; la partie du haut (le ciel), ainsi que 
la partie du bas qui resterait fixe (Les bâtiments et la rue). Mettre les hélicoptères comme faisant
partie du décors élimine en quelque sorte la limite d'élément à afficher à l'écran. Les sprites serait
donc réservé au camion qui doivent se situer sur une couche au dessus du decors, en raison des bâtiments.

Compromis? Pas de nuages XD Mais il me faut voir comment mettre à jour le background en temps réel.

## Assembleur et Linker

Les graphismes sont déjà compilé dans une rom ".CHR". Il n'est donc pas necessaire de s'en occuper
pour le build du jeu, mais je vais tout de même expliquer le process.

Nous commençons avec les tilesheet et spritesheet en format 128x128 avec couleurs indexé sur 2 bit 
(4 couleur par pixel) que nous devons exporter de photoshop, jusque là rien de vraiment particulier.

Une fois que nous avons les graphismes exporté en bitmap nous faisons appel à un petit programme 
(NES Screen Tool) qui nous permet de pouvoir convertir le tout en CHR rom. La rom est ensuité importé
dans le base code du jeu.

---

Nous assemblons le code avec CC65. Il s'agit à la base d'un compilateur C mais nous nous serviront que
de la partie assembleur afin d'obtenir une rom en sortie qui pourra être executé sur un émulateur.

Nous ouvrons un terminal depuis la racine du dossier projet et nous executons ces deux commandes:

build\cc65\bin\ca65.exe -t nes invader.asm -o build/invader.o 			// Assembleur
build\cc65\bin\ld65.exe -t nes build/invader.o -o build/invader.nes 	// Linker

Et voilà nous avons une rom fonctionnelle!

## Jouer sur console

Il est possible de séparer la ROM ".nes" en deux rom distincte: "PRG" et "CHR" pour être enregistré 
sur deux EEPROM ensuite soudé sur une carte et inséré dans une console originale.

Il est aussi possible d'utiliser une flash cart nes pour arriver au même résultat sans fer à souder.

## Comment jouer?

Une rom déjà assemblé est disponible dans le dossier 'build'

- Executez la ROM dans un émulateur de votre choix (Mesen par ex.)
- Le camion peut être déplacé de gauche à droite et vice-versa avec la croix directionnelle.

## License

[CC BY-NC](https://creativecommons.org/licenses/by-nc/4.0/)