Revenir au plan du site
Déplacer des données
La première des choses à savoir réaliser dans un programme, parce que c'est une des bases fondamentales, est de déplacer des données ou de les copier. La zone mémoire écran est une zone de travail que l'on modifie pour en changer le contenu, réaliser des animations. Par contre il faut garder dans un autre endroit de la mémoire, souvent caché, une copie des données graphiques que l'on ne va pas altérer.
Dans ce premier exemple, nous avons deux fichiers écran contenant des données graphiques et nous allons copier alternativement l'un et l'autre dans la zone de mémoire graphique.
Pour assembler ce source, vous aurez besoin des deux fichiers écran
[ici] et
[là]
BUILDSNA ; on veut un snapshot parce que c'est le plus simple
BANKSET 0 ; on veut assembler dans les premiers 64K
org #100 ; on veut mettre notre programme au début de la mémoire
run #100 ; et le point de démarrage est ici aussi
recommence
ld hl,ecran1
ld de,#C000 ; adresse par défaut de la mémoire graphique
ld bc,16384 ; notre écran fait la taille de la page vidéo
ldir ; lancer la copie de HL vers DE sur BC octets
ld hl,ecran2
ld de,#C000 ; adresse par défaut de la mémoire graphique
ld bc,16384 ; notre écran fait la taille de la page vidéo
ldir ; lancer la copie de HL vers DE sur BC octets
jr recommence ; et on revient au début du programme
org #4000 : ecran1 incbin 'premierSourceEcran1.ecran'
org #8000 : ecran2 incbin 'premierSourceEcran2.ecran'
|
Et voilà, les copies d'écran s'enchainent, mais c'est très désagréable car l'écrasement de la mémoire vidéo n'est pas très rapide et les images se mélangent.
Il faudrait commencer par ajouter une pause, que l'on ait le temps de bien voir chaque écran en entier. Pour faire une pause, une grosse boucle et le plus simple. Notre Z80 ne réalise qu'un million d'opérations par seconde au maximum.
BUILDSNA ; on veut un snapshot parce que c'est le plus simple
BANKSET 0 ; on veut assembler dans les premiers 64K
org #100 ; on veut mettre notre programme au début de la mémoire
run #100 ; et le point de démarrage est ici aussi
recommence
ld hl,ecran1
ld de,#C000 ; adresse par défaut de la mémoire graphique
ld bc,16384 ; notre écran fait la taille de la page vidéo
ldir ; lancer la copie de HL vers DE sur BC octets
call unePause
ld hl,ecran2
ld de,#C000 ; adresse par défaut de la mémoire graphique
ld bc,16384 ; notre écran fait la taille de la page vidéo
ldir ; lancer la copie de HL vers DE sur BC octets
call unePause
jr recommence ; et on revient au début du programme
unePause
ld bc,0 ; BC est déjà à zéro à la fin d'un LDIR, mais c'est pour la forme
.loop
nop 30 ; on ajoute une trentaine de NOP, l'instruction qui ne fait rien
dec bc
ld a,b : or c ; est-ce que BC vaut zéro?
jr nz,.loop ; non, alors on reboucle
ret
org #4000 : ecran1 incbin 'premierSourceEcran1.ecran'
org #8000 : ecran2 incbin 'premierSourceEcran2.ecran'
|
Grâce à notre pause, le fait que la copie d'écran ne soit pas instantanée n'est plus un problème.