Déplacer des donnéesLa 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 64Korg #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 64Korg #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. Roudoudou CPCrulez[Content Management System] v8.732-desktop/c Page créée en 097 millisecondes et consultée 28 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|