Revenir au plan du site

Color cycling et utilisation de la mémoire étendue

L'Amstrad CPC n'est capable d'afficher que les données présentes dans la mémoire centrale. Il ne sait pas afficher ce qui est dans la mémoire étendue.

En conséquence de quoi il peut être intéressant d'exécuter du code depuis la mémoire étendue, tandis que l'intégralité de la mémoire centrale est remplie par des graphismes.

L'effet du jour (sur proposition discord de MacDeath) nécessite 16 images de 16K


Comme je vous l'ai dit, toute donnée qui doit être affichée doit être en mémoire centrale. La copie serait trop lente, il faut ruser.

Comme le motif est noir et blanc, on peut diviser le nombre d'images nécessaires par deux et passer de 16 à 8 en inversant les couleurs. Il suffit d'afficher normalement les 8 premières images avec la palette à Noir et Blanc, puis de réafficher les mêmes images avec la palette à Blanc et Noir.


Les points blancs correspondent aux légères différences entre les deux images dû à la méthode de calcul de rendu de l'animation générale. Sans incidence sur le résultat puisque nous allons nous passer de toutes les images 9,10,11,12,13,14,15 et 16 :)

Il nous reste quand même deux fois trop d'images pour notre mémoire centrale!

La résolution choisie est le mode 1 qui n'est pas monochrome mais une résolution à 4 couleurs. On peut donc fusionner nos images et jouer à nouveau avec les couleurs.

Les couleurs de l'image 0 seront dans les bits du bas, les couleurs de l'image 1 seront dans les bits du haut. L'exploitation de notre palette change :
- Premier affichage avec du noir en 0 et 2, du blanc en 1 et 3
- Deuxième affichage avec du noir en 0 et 1, du blanc en 2 et 3

Et pour l'inversion au bout de 8 affichages? Rien de plus simple, il suffit toujours de permuter le noir et le blanc.


Il y a deux rouges différents sur l'image, l'un pour la première image, l'autre pour la seconde.

ENFIN! Nous n'avons plus que 4 images de 16K qui vont rentrer pile dans la mémoire centrale. Reste à changer la résolution écran via les registres 1,2,6 et 7 du CRTC. Dans cet exemple, je les précharge dans le snapshot et le chargement des 64K en mémoire centrale est éludé.

Si vous voulez voir comment il est possible de charger l'ensemble de la mémoire centrale de façon conventionnelle (sans utiliser la facilité des snapshots), vous pouvez consulter [ cet article ]. L'idée ici était de prouver qu'on peut faire des choses spectaculaires avec "pas grand chose" :)

Il vous faudra télécharger le [ Pack de 4 images ] CPC pour assembler ce source
buildsna
snaset GA_RAMCFG,#C2 ; le code va démarrer dans la mémoire étendue
snaset CRTC_REG,1,32 ; réglages écran
snaset CRTC_REG,2,42
snaset CRTC_REG,6,32
snaset CRTC_REG,7,34

; 64K de graphismes en mémoire centrale
bankset 0
incbin 'fullSet.bin'

; code en mémoire étendue, mais visible par le Z80 car commuté par la fonction 2
bankset 1
org #100
run #100

ld sp,#100
ld bc,#BC00+12 : out (c),c

ld hl,#544B : ld de,#4B54
debut
call novbl : ld bc,#BD00 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
call novbl : ld bc,#BD10 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
call novbl : ld bc,#BD20 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
call novbl : ld bc,#BD30 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
ex hl,de
jr debut

couleursPaires
ld bc,#7F00 : out (c),c : ld a,h : out (c),a
ld bc,#7F01 : out (c),c : ld a,l : out (c),a
ld bc,#7F02 : out (c),c : ld a,h : out (c),a
ld bc,#7F03 : out (c),c : ld a,l : out (c),a
ret

couleursImpaires
ld bc,#7F00 : out (c),c : ld a,h : out (c),a
ld bc,#7F01 : out (c),c : ld a,h : out (c),a
ld bc,#7F02 : out (c),c : ld a,l : out (c),a
ld bc,#7F03 : out (c),c : ld a,l : out (c),a
ret

novbl ld b,#F5 : in a,(c) : rra : jr c,novbl
vbl ld b,#F5 : in a,(c) : rra : jr nc,vbl : ret