Voici les étapes pour la construction du sprite compilé (on peut le faire à la main aussi) :
Image de départ :

On divise l'image en deux, une partie pour la RAM A et une autre pour la RAM B
Voici une représentation des données pour la RAM A :
Code:
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
....cc..........................................................................
....cc..........................................................................
...dccc.........................................................................
....ddac........................................................................
....ddaa........................................................................
....ddaa........................................................................
....cdaa........................................................................
....dcca........................................................................
....dcbc........................................................................
...cdcba........................................................................
...ddcbb........................................................................
..dddcbb........................................................................
....dcbb........................................................................
....dcbb........................................................................
....ddab0.......................................................................
....dd2b0.......................................................................
....dd22........................................................................
....d022........................................................................
...cdd33........................................................................
....dd0e........................................................................
.....d32........................................................................
....c222........................................................................
....2322........................................................................
....2d22........................................................................
....3b13........................................................................
....eadd........................................................................
....d9d0........................................................................
.....a.d........................................................................
.....9.d........................................................................
.......d........................................................................
.......d........................................................................
.......d........................................................................
.....a9a........................................................................
.....909........................................................................
.....0aa........................................................................
.....1b0........................................................................
....e1f21.......................................................................
....e1ffe1......................................................................
....e0ee00..
Les points sont des pixels transparents
L'image est complétée sur 80 pixels de large pour respecter l'aspect continu de la zone mémoire et faciliter les calculs.
De l'espace vide est présent en haut de l'image car le sprite est issu d'une planche, ça n'a pas d'importance pour l'exemple.
Etape 1La lecture commence en haut à gauche et on cherche des motifs, a chaque motif est attribué un code correspondant.
On trouve donc :
motif XX (ligne 1) , motif XX (ligne 2), motif _XXX (ligne (3) , motif X_ (ligne 3), ...
Le motifs sont attribués dans l'ordre en utilisant les moins couteux d'abord en terme de cycles.
On fait ça pour toute l'image.
Etape 2Chaque motif utilise soit un adressage indexé (LD offset,S), soit un adressage immédiat (PULS) pour la lecture du fond à sauvegarder.
On va donc constituer des "noeuds" ou groupes autour des motifs utilisant un adressage immédiat.
On cherche ensuite à rattacher des motifs à adressage indexé dans la limite -128 +127 pour ne pas être pénalisé par le cout de l'offset (ici seulement +1).
Une fois qu'on a fait ça, on recherche les motifs qui ne sont pas rattachés à des noeuds et on en constitue des nouveaux.
ça donne pour l'image de référence :
Noeud 1
(index:position:offset:pattern)
(0:362:-120:Pattern_11)
(1:402:-80:Pattern_11)
(2:441:-41:Pattern_0111)
(3:443:-39:Pattern_10)
(4:482:0:Pattern_1111)
(5:522:40:Pattern_1111)
(6:562:80:Pattern_1111)
(7:602:120:Pattern_1111)
Noeud 2
(index:position:offset:pattern)
(8:642:0:Pattern_1111)
Noeud 3
(index:position:offset:pattern)
(9:682:-119:Pattern_1111)
(10:721:-80:Pattern_0111)
(11:723:-78:Pattern_11)
(12:761:-40:Pattern_0111)
(13:763:-38:Pattern_11)
(14:801:null:Pattern_111111) Adressage immédiat
(15:842:41:Pattern_1111)
(16:882:81:Pattern_1111)
(17:922:121:Pattern_1111)
(18:924:123:Pattern_10)
Etape 3On a maintenant une liste de motifs ou "patterns", on va parcourir cette liste et générer le code ASM.
On prends le premier noeud et on calcule le LEAS à partir de la position actuelle du sprite à l'écran (chargée dans S)
Etape 4La suite se complique un peu ...
On va prendre chaque motif et quand c'est possible, dissocier le code de sauvegarde du fond de celui de l'écriture du sprite.
C'est possible sur un motif :
Code:
LDX -20,S
PSHU X
LDX #$ddac
STX -20,S
On peut executer
Code:
LDX -20,S
PSHU X
dans n'importe quel ordre dans le noeud, car S ne bouge pas, il faut juste qu'on écrive la sauvegarde du fond avant l'écriture du sprite ;-)
ça ne fonctionne pas pour les motifs avec gestion de transparence par contre...
L'idée est donc constituer des sous-groupes dans le noeud qui ont la même "empreinte".
Par exemple si on a deux motifs d'écriture (avec la même valeur) de :
Code:
LDX #$ddac
STX -20,S
Etape 5mais pourquoi ?
Car on va ensuite tester tous les agencements de sous-groupes pour le noeud, en modifiant leur ordre.
S'il y a moins de 10 groupes on test toutes les combinaisons possibles, sinon on teste les combinaisons hasard dans une limite de qq millions.
Pour chaque combinaison on évalue le cout en cycles et on garde la meilleure proposition.
Les variations en terme de cout sont liées aux optimisations lors de la génération du code.
Etape 6Otpim 1 : sur la sauvegarde du fond, on regroupe les registres a sauvegarder sur un PSHU commun
Optim 2 : sur l'écriture de l'image, on réutilise les registres déjà chargés
Optim 3 : sur le rétablissement du fond, on regroupe les registres sur les PUL/PSHU
Optim 4 : on sauvegarde S au milieu des données de l'image, et ce une seule fois pour tout le noeud ... le rétablissement se fait donc uniquement par PUL, PSH et STD indexé, S étant rechargé par PUL/PSHU, donc pas besoin de LEAS
Pour le noeud 1, la meilleur solution trouvée est la suivante :
Rappel des patterns du noeud
(0:362:-120:Pattern_11)
(1:402:-80:Pattern_11)
(2:441:-41:Pattern_0111)
(3:443:-39:Pattern_10)
(4:482:0:Pattern_1111)
(5:522:40:Pattern_1111)
(6:562:80:Pattern_1111)
(7:602:120:Pattern_1111)
Code de sauvegarde du fond et de l'écriture de l'image :
Code:
10 4+4 A011 32 E9 01E2 LEAS 482,S
12 4+1 A015 A6 E8 88 LDA -120,S * Lecture fond Pattern 0
13 4+1 A018 E6 E8 B0 LDB -80,S * Lecture fond Pattern 1
14 5+1 A01B AE E8 78 LDX 120,S * Lecture fond Pattern 7
15 6+0 A01E 10AE E4 LDY ,S * Lecture fond Pattern 4
16 5+6 A021 36 36 PSHU Y,X,B,A * Sauvegarde Fond Pattern 4, 7, 1, 0 (Optim 1)
17 5+1 A023 EC E8 28 LDD 40,S * Lecture fond Pattern 5
18 5+1 A026 AE E8 50 LDX 80,S * Lecture fond Pattern 6
19 5+4 A029 36 16 PSHU X,D * Sauvegarde Fond Pattern 6, 5 (Optim 1)
20 5+1 A02B EC E8 D7 LDD -41,S * Lecture fond Pattern 2
21 5+2 A02E 36 06 PSHU D * Sauvegarde Fond Pattern 2
22 2 A030 84 F0 ANDA #$F0 * Masque de transparence Pattern 2
23 2 A032 8A 0D ORA #$0d * Ecriture pixel couleur d
24 2 A034 C6 CC LDB #$cc * Chargement pixel Pattern 2, 0 et 1 couleur cc
25 5+1 A036 ED E8 D7 STD -41,S * Ecriture pixel Pattern 2
26 4+1 A039 E7 E8 88 STB -120,S * Ecriture pixel Pattern 0
27 4+1 A03C E7 E8 B0 STB -80,S * Ecriture pixel Pattern 1
28 3 A03F CC DDAC LDD #$ddac * Chargement pixel Pattern 4 couleur ddac
29 5+0 A042 ED E4 STD ,S * Ecriture pixel Pattern 4
30 2 A044 C6 AA LDB #$aa * Chargement pixel Pattern 5 couleur ddaa (Optim 2)
31 5+1 A046 ED E8 28 STD 40,S * Ecriture pixel Pattern 5 (Optim 2)
32 5+1 A049 ED E8 50 STD 80,S * Ecriture pixel Pattern 6 (Optim 2)
33 2 A04C 86 CD LDA #$cd * Chargement pixel Pattern 5 couleur cdaa (Optim 2)
34 5+1 A04E ED E8 78 STD 120,S * Ecriture pixel Pattern 7 (Optim 2)
35 4+1 A051 A6 E8 D9 LDA -39,S * Lecture fond Pattern 3
36 5+3 A054 36 42 PSHU S,A * Sauvegarde Fond Pattern 3 et position du noeud S (Optim 4)
37 2 A056 84 0F ANDA #$0F * Masque de transparence Pattern 3
38 2 A058 8A C0 ORA #$c0 * Chargement pixel couleur c
39 4+1 A05A A7 E8 D9 STA -39,S * Ecriture pixel Pattern 3
Code de rétablissement du fond :
Code:
563 5+3 A522 37 42 PULU A,S * lecture données fond Pattern 3 et position du noeud S (Optim 4)
564 4+1 A524 A7 E8 D9 STA -39,S * Ecriture fond pixel Pattern 3
565
566 5+6 A527 37 36 PULU D,X,Y * lecture données fond Pattern 2, 5 et 6 (Optim 3)
567 5+1 A529 ED E8 D7 STD -41,S * Ecriture fond pixel Pattern 2
568 5+1 A52C AF E8 28 STX 40,S * Ecriture fond pixel Pattern 5
569 6+1 A52F 10AF E8 50 STY 80,S * Ecriture fond pixel Pattern 6
570
571 5+6 A533 37 36 PULU A,B,X,Y * lecture données fond Pattern 0, 1, 7, 4 (Optim 3)
572 4+1 A535 A7 E8 88 STA -120,S * Ecriture fond pixel Pattern 0
573 4+1 A538 E7 E8 B0 STB -80,S * Ecriture fond pixel Pattern 1
574 5+1 A53B AF E8 78 STX 120,S * Ecriture fond pixel Pattern 7
575 6+0 A53E 10AF E4 STY ,S * Ecriture fond pixel Pattern 4