L'instruction LDIR (Plissken)

Bon si jamais vous ne comprenez rien, ne desesperez pas, voici mon adresse mail au cas ou vous voudriez des renseignements : lynxamstrad@hotmail.com.



Avant de parler de l'instruction Ldir, nous allons étudier la mémoire écran. Sur CPC, nous avons une ram principale de 64Ko, pour les possesseurs de CPC avec 128Ko de mémoire la ram supplémentaire sert de banque de mémoire. Cette ram principale est divisée en 4 ram de 16Ko chacune :



- La 1ere partie se situe entre l'adresse hexadécimale &0000-&3fff : c'est elle qui contient des informations importantes au CPC.
- La 2eme partie se situe entre l'adresse &4000-&7fff
- La 3eme, entre &8000 et &bfff et à partir de &b000, on trouve des mini-programmes appele "vecteurs systèmes" qui peuvent nous servir.
- La 4eme et dernière page de mémoire se situe entre &c000 et &ffff : c'est la mémoire écran, autrement dit, quand vous allumez le CPC, ce que vous voyez à l'écran est la page de mémoire &c000-&ffff. Elle est attribuée à l'écran.

 


Pour confirmer ce que je viens de dire, tapez : mode 1:locate 10,10:poke &c000,255 : vous verrez apparaitre en haut à gauche un point, "mode1" sert à effacer l'écran, "locate 10,10" sert à déplacer le curseur et "poke &c000,255" sert à placer une valeur en mémoire, ici, le debut de la mémoire écran.

 

 

Maintenant, tapez ce programme :
10 mode 1
20 for i=0 to &4000:poke &c000+i,255:next
run

 

 

Bon, le CPC va se planter, mais vous vous rendrez compte d'une choses, les lignes de l'écran ne se suivent pas, quand une ligne est dessiné, ensuite on saute de 7 lignes. C'est comme ça qu'est organisée la mémoire écran.
Sur un écran normal (c'est à dire non étiré ou diminué), la longueur d'une ligne est de 80 octets et la une règle est a apprendre :

- en mode 0 : 1 octet de la mémoire écran est égal a 2 pixels
- en mode 1 : 1 octet de la mémoire écran est égal a 4 pixels
- en mode 2 : 1 octet de la mémoire écran est égal a 8 pixels

 

L'adresse du début de l'écran est : &c000,comme on a vu que les lignes écran ne se suivaient pas, pour connaitre l'adresse en dessous de la ligne à laquelle on se trouve, il faut ajouter &800 a l'adresse actuelles, mais a partir d'une certaine adresse, il faut ajouter &50, un tableau de quelques adresses écran est à la fin du cours.
Exemple : &c000+&800=&c800, l'adresse du début de la 2e ligne de l'écran est : &c800.
En assembleur, pour éviter de calculer soit même les adresses écran, il existe le vecteur systeme "&bc26", que nous verrons un peu plus tard.

 

Bon, un peu de pratique. Maintenant, il va vous falloir un "assembleur", c'est à dire un utilitaire qui va nous permettre de programmer en assembleur. Bon, vous pouvez utiliser "Dams", "Maxam" ou bien l'assembleur integré à votre émulateur, bien que l'ideal soit un vrai CPC.

Pour ceux qui ne le savent pas, le microprocesseur Z80 du bon vieux CPC, possède des registres, indentifiables à des variables (je vais me faire gueuler dessus car ce n'est pas vraiment ca). Pour l'instant je n'explique pas le fonctionnement des registres, plus tard surement car je n'ai pas envie de vous assommer avec beaucoup de théorie.


Il y a les registres 16 bit qui peuvent contenir des valeurs de 0 a 65535 et les registres 8 bit qui peuvent contenir des valeurs de 0 a 255, pour l'instant c'est ce que vous devez savoir.

 

Hop, le programme assembleur commenté :

Org &4000; adresse de départ du programme; si vous avez dams, tapez ent $ en dessous de org &4000
ld a, 1; dans le registre a du Z80, on met 1
call &bc0e; on appelle un programme de la rom qui est l'équivalent de l'instruction "mode" du basic et qui met le mode indiquer par le registre A.
ld hl, &c001; dans le registre hl, on met l'adresse du 2e octet de la mémoire
ld de, &c000; dans DE on met l'adresse du premier octet de la mémoire écran
ld bc, 79; dans BC on met le nombre d'octets d'une ligne d'écran
ldir; on place l'instruction ldir
ret; une fois finie on quitte le programme

J'oubliai, chargez une image a l'écran : load "ecran", &c000 puis call &4000, après avoir assembler le programme.

Que se passe t'il ?
La 1ere ligne de l'écran se déplace.

Explication :

Définition de Ldir : Cette instruction programme le transfert d'une zone mémoire vers une autre zone mémoire. Hl et DE pointent respectivement sur les premiers octets de chacune de ces zones. BC contient le nombre d'octets a transférer.

Oula, bien compliqué ;) Mais avec Plissken tout devient clair.

Dans notre exemple HL contient l'adresse de depart , la valeur contenue à cette adresse va être recopiée dans DE (comme DEstination), puis on va se décaler d'un cran et recommencer jusqu'a ce que la valeur contenue dans BC soit égale à 0.

Schéma :

1ere fois :
hl=&c001
de=&c000
b, 79
le contenu d'HL va dans DE et B=B-1=78
Hl=hl+1=&c002
DE=DE+1=&c001

2e fois :
hl=&c002
de=&c001
le contenu d'Hl va dans DE et b=b-1=77
hl=hl+1=&c003
DE=DE=1=&c002

et dès que b=0 alors on va à la suite ,ici, RET qui sert à quitter le programme. En fait Ldir sert à copier un bout de la mémoire à un autre endroit de la mémoire.
Ldir se sert de HL, DE et BC. Ldir ne sert pas qu'à faire des scrolls, voici un exemple de programme :

org&3000
ld hl, &4000
ld de, &c000
ld bc, &4000
ldir
ret

Cette routine sert à recopier la page &4000-&7fff en &c000-&ffff, ainsi, vous pouvez charger un écran de 17Ko en &4000 et le recopier en &c000, pour ceux qui on déjà vu mon slide show en basic, (disponible sur Emultoo) cette routine me sert pour afficher mes images, et je me sert de la mémoire supplémentaire des 6128(+). Pour charger une image en &4000, il faut d'abord taper en basic : memory &4000.

Les 6128 et 6128+ ainsi que les autres CPC avec une extension mémoire, peuvent accueillir dans les 64Ko supplémentaires 4 écrans de 17Ko, ceux qui connaissent Bank Manager fourni avec les disquettes CP/M vont comprendre son fonctionnement.

Pour utiliser les banks de mémoire supplementaire, il faut passer par le Gate Array, circuit du CPC gérant les couleurs, le mode écran et la mémoire.
Out &7f00, numéro de la bank (&c4, &c5, &c6, &c7).
Donc il est facile de faire un petit programme pour charger 5 images en mémoire. Mais ce qu'il faut savoir c'est que les banks de mémoires on la même adresse que la 2e part de Ram centrale : &4000-&7fff.

Bon, voila c'est tout pour cette fois, le prochain cours sera sur l'affichage de sprite avec une routine basée sur le ldir et une autre sur ldi qui est quasiment pareil que ldir et vous apprendrez ce que c'est que le temps-machine et comment le visualiser. Tout un programme.

Et surtout pour tout renseignement : lynxamstrad@hotmail.com


Et un petit tableau des permières adresses écran :

&C0001ère ligne
&C8002ème ligne
&D0003ème ligne
&D8004ème ligne
&E0005ème ligne
&E8006ème ligne
&F0007ème ligne
&F8008ème ligne
&C0509ème ligne
&C85010ème ligne
&D05011ème ligne
&D85012ème ligne
&E05013ème ligne
&E85014ème ligne
&F05015ème ligne
&F85016ème ligne


Comme vous connaissez maintenant les adresses des 16 premières lignes de l'écran, vous pouvez donc faire un programme qui vous les décale et sachez que LDDR est la même chose que Ldir, mais dans l'autre sens HL et DE sont décrementé, donc il faut mettre l'adresse de fin de la mémoire écran, je vous laisse méditer dessus et espère que le cours vous aura plus et aura été assez simple, et pour voir une aplication de Ldir, récupérer ma première démo en assembleur ou demander-la moi et vous verrez que le texte qui se déplace est basé sur Ldir.
Pour le prochain cour, préparer votre logiciel de dessin (OCP , y'a pas mieux) car pour les sprites, vous en aurez besoin.

A la prochaine et n'oubliez pas : CPC FOR EVER !

lynxamstrad@hotmail.com

 

 

ps : ce cours a été tapé sur un vrai CPC, puis transferer sur le PC.

  Voir cet article au format PDF Imprimer cet article

RECHERCHE
* Donathon 2018 *

140/200 €

 

 

 

 En savoir plus

LANGUE
Le Chat
 Smiles  Loading...
EN LIGNE
9 Personne(s) en ligne (1 Personne(s) connectée(s) sur Les articles Amstrad)

Utilisateur(s): 2
Invité(s): 7

Moonbeam, Golem13, Plus ...
Musiques CPC

Lecteur MP3
CPC-Scene Radio

 

 

ROLAND RADIO

Connexion
Identifiant :

Mot de passe :

Se souvenir de moi



Mot de passe perdu ?

Inscrivez-vous !

 

Informations
________________________________

Suivre Amstrad.eu

________________________________

Autres Créations web

________________________________

 

Declaration CNIL : 1005884

Association : 0540200002843

Charte

Avertissements

Plan du site

Carte de France des membres

 

 

 

Facebook.

Twitter.

RSS forum.

RSS News.

Contact.

 

Gaston-Phoebus.com

Amstrad.eu

untour.fr

Cathydeco.com

Higoogle

Harloup.fr

** Faire un don **

 

Conception Phenix © 2000 - 2014