Amstrad Plus Index du Forum

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

***** Changement des couleurs
Aller à la page: 1, 2  >
 
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation
Sujet précédent :: Sujet suivant  
Auteur Message
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Ven 11 Déc - 13:57 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

Bonjour,

Ayant discuté avec Case à l'Alchimie 0xb de choses et d'autres, j'avais promis de lui faire parvenir rapidement une routine de changement de couleurs en soft, donc utilisant le vecteur système #bc32 (SCR_SET_INK).

Voici donc sans plus attendre, la dite routine.

Code:
           org #a000
;
; Chargement de la palette des 16 couleurs
; en utilisant le vecteur systeme #bc32 
;                !!   pour Case !!
; Mode 0 - 16 couleurs - on teste le bit 4
; Mode 1 - 4 couleurs - on teste le bit 2 
;
           ld hl,tbcolour  ; table des couleurs
           ld e,0   ; depart pen 0
loopcol ld b,(hl)  ; recupere couleur dans b
           ld c,b  ; c=b donc même couleur
           ld a,e  ; on se sert du registre compteur e pour gérer le numéro d'encre
           push de:push hl ; on sauvegarde les registres modifié par le vecteur
           call #bc32 ; Appel du vecteur Système SCR_SET_INK
           pop hl:pop de  ; on restitue ces registres
           inc hl   ; prochaine couleur
           inc e   ; 1 couleur de moins
           bit 4,e  ; teste si 16eme couleur
           ret nz   ; on est arrive
           jr loopcol  ; sinon on continue
;;
tbcolour
           byte 0,1,2,14
           byte 20,9,18,22
           byte 3,6,15,24
           byte 4,8,16,26










Le fonctionnement du vecteur #bc32 est le suivant :

-le registre A contient le numéro d'encre à charger
-le registre B contient la couleur 1
-le registre C contient la couleur 2
...
Les registres HL, et DE sont modifiés à la sortie donc, il faut bien penser à les sauvegarder, sinon plantage de la routine qui ne retrouve plus ses repères.
Je signale également que les registres AF et BC sont modifiés également mais qu'il n'y a pas besoin de les sauvegarder vue la conception de cette routine.

Pour information, je n'ai pas géré le border dans cette routine, mais sachez qu'il faut utiliser le vecteur système #bc38 (SCR_SET_BORDER) qui s'occupe de cette tâche!

Même si cela vous semble logique, je précise que les registres AF, BC, DE et HL sont modifiés une fois le vecteur appelé dans ce cas aussi.

Code:
          ...
          ld bc,#0000 ; b=couleur 1/c=couleur 2
          call #bc38    ; border b,c 
          ...









_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Publicité






MessagePosté le: Ven 11 Déc - 13:57 (2015)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 89

MessagePosté le: Sam 12 Déc - 02:09 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

merci ast pour la routine et surtout merci pour le code commenté car j'ai commencé a m’intéresser a l'assembleur et j'ai du mal ...  ça pique les neurones et j'ai plus 20 ans ^^
ref pour l'instant je potasse les différents livres dispo pour coder sur le cpc

donc tu me dis si je me trompe ( je me trompe surement)

si je fais un

LD HL #C000  

je charge dans le registre HL l'adresse de l'ecran

si je fait un LD (HL),#ff

j'ecris un octet contenant 255  sur l’écran
ca j'ai testé et ca marche

par contrE je pensais pouvoir faire


LD HL #C000  
LD BC #4000
LD (HL),(BC)

afin de copier l'octet contenu en 4000 vers l’écran mais cela ne fonctionne pas Smile
ensuite je compte incrémenter les registres hl et bc pour copier l'octet suivant
mais ce serait trop simple pour que ce soit faisable Smile

quel est le souci ?

en gros j'ai sauver une image sous un format spécial car je veux pouvoir charger une image qui ne fais pas la taille de l’écran

pour éviter de devoir calculer a chaques fois l'adresse de début de ligne je l’intègre a l'image

j'ai donc 2 byte qui contiennent l’offset mémoire de l’écran donc sur 16 bits puis les 80 bytes contenant les données de la ligne

je cherche a faire une routine asm que je pourrais appeler du basic pour décoder mon image toujours dans mon optique de jeu

pour l'instant j'y arrive en basic mais pas encore en asm l’intérêt etant d’accélérer tout ca bien sur Smile


bon sur ce j'aurais pas du abuser de la prune et du coup je vais me coucher



edit:j'ai compris mon erreur je tente de mettre la valeur #4000 en #C000... du coup vas falloir que je cherche a faire autrement Smile
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 15

MessagePosté le: Sam 12 Déc - 03:00 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

En Z80A, beaucoup de registres sont spécialisés pour certaines instructions.

Tu ne peux pas faire LD (HL),(BC), mais tu peux considérer que :
HL est ton pointeur source (dans ton exemple, 4000)
DE est ton pointeur destination (dans ton exemple, C000)
BC est un nombre d'itérations
Tu peux faire la chose suivante en utilisant A comme registre intermédiaire:
LD A,(HL)
LD (DE),A
INC HL
INC DE

Mais sinon, tu peux utiliser l'instruction LDI, qui fait exactement la même chose que les 4 instructions avec un DEC BC en prime.

Pour transférer ton écran de 4000 à C000 avec une longueur de 4000
LD HL,4000
LD DE,C000 (DE ==> DESTINATION)
LD BC,4000 (Longueur)
LDIR

Cette instruction fait le transfert et revient au même que la boucle que tu voulais faire :
LD HL,4000
LD DE,C000 (DE ==> DESTINATION)
LD BC,4000 (Longueur)
TRANSF:
LD A,(HL)
LD (DE),A
INC HL
INC DE
DEC BC
LD A,B
OR C
JR NZ,TRANSF


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Sam 12 Déc - 03:09 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

Tout dépends de ce que tu veux faire. Si c'est juste copier une image .scr classique chargée en #4000 et l'envoyer en #c000, rien de plus simple...
Code:

...
          Ld hl,#4000 ; Adresse source
          Ld de,#c000 ; Adresse destination
          Ld bc,#4000 ; Longueur de l'image
          Ldir              ; on copie les données commencant en hl à de avec une longueur bc
...

C'est un simple transfert de bloc, encore faut il le maitriser ? Mais rien de bien compliqué lorsque l'on comprends la mécanique.

Dans un second temps, si tu veux afficher une image avec un format dédié, il me (nous) faudra un peu plus d'informations sur ledit format. En gros, il me (nous) faut la largeur/hauteur de l'image, la zone mémoire à laquelle tu veux afficher ton image, et, ce n'est pas tout,la configuration crtc dans laquelle l'image doit être affichée.
Merci de nous fournir toutes ces infos. (Voire le listing basic que tu utilises pour mieux envisager l'avenir!)
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Sam 12 Déc - 03:11 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

Désolé Serge, j'ai répondu en même temps... En gros, la même chose.... J'ai été cependant volontairement moins complet que toi.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 89

MessagePosté le: Sam 12 Déc - 15:30 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

merci a vous pour tout ces conseils, ça me met sur la voie

Ast a écrit:

Désolé Serge, j'ai répondu en même temps... En gros, la même chose.... J'ai été cependant volontairement moins complet que toi.
et c'est bien aussi de ne pas trop en dire car ca permet de chercher par soi même au lieu de recopier bêtement du code deja tout fait

mais j'ai vu cette commande LDIR et je voulais aussi explorer cette option donc c'est pas vraiment  un spoil Wink

quand au format dédier j'ai simplement pris un SCR et sauver l'image en dés-entrelaçant les lignes en mémoire

0 79    ligne 1
80 159 ligne 2

et ajouté avant chaque debut de ligne l'offset sur l'ecran
#0000
#0800
#1000
du coup je charge mon image je lis les 2 octets de l'offset puis les 80 octets de la ligne ce qui fait que mon image est affichée ligne après ligne du haut vers le bas

car mon but est d'avoir une image sur la partie haute de l’écran et une zone en dessous ou se trouverais par exemple des commandes ou des descriptions textuelles etc...
du coup je vais creuser un peu cet après midi

encore merci Smile
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Sam 12 Déc - 15:39 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

Creuse et reviens vers nous... Je (nous sommes) suis curieux de voir ce que celà va donner...

_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Sam 12 Déc - 18:29 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

case a écrit:
quand au format dédier j'ai simplement pris un SCR et sauver l'image en dés-entrelaçant les lignes en mémoire

0 79    ligne 1
80 159 ligne 2

et ajouté avant chaque debut de ligne l'offset sur l'ecran
#0000
#0800
#1000
du coup je charge mon image je lis les 2 octets de l'offset puis les 80 octets de la ligne ce qui fait que mon image est affichée ligne après ligne du haut vers le bas.






Tu n'as pas besoin de faire cela. Il y a une routine système située en #bc26 (SCR_NEXT_LINE) qui permet de passer d'une ligne à une autre. Cela te permettra d'eviter ton ajout d'offset à chaque début de ligne.
Concernant ce vecteur, j'en avais également parlé ici.


Pour ton "dé-entrelaçage" je ne comprends pas vraiment ce que tu fais.


La ligne 0 va de 0 a 79 et est située en #c000
La ligne 1 va de 80 à 159 et se trouve en #c800 (c'est bien cela?)


Si tel est le cas, tu n'as rien modifié, le format du cpc étant déjà celui-ci. Tu as seulement rajouté 2 octets au début de chaque lignes qui definissent l'offset de début de chaque lignes.


Dans ce cas là, la méthode proposée par Longshot ou moi est la plus intéressante. (Celle avec l'instruction LDIR)
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 89

MessagePosté le: Sam 12 Déc - 19:18 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

Ast a écrit:

Si tel est le cas, tu n'as rien modifié, le format du cpc étant déjà celui-ci. Tu as seulement rajouté 2 octets au début de chaque lignes qui definissent l'offset de début de chaque lignes.


n'oublions pas que je débute alors j'ignore encore certaines choses Smile

j'ai bien étudié la mémoire graphique du cpc(même si je n'ai pas ton recul) et la seconde ligne ne débute pas a l'octet 80 dans une image .scr ou sur  un écran de cpc  ou alors j'ai loupé un épisode elle est bien stockée en $800 dans le fichier .

et si je charge une image en &c000 je le vois bien qu'elle s'affiche en affichant la première ligne puis la 8 ° puis la 16° etc... 

si je ne veux afficher que 100 pixels de haut sur l'écran je ne vais pas charger un SCR standard ce qui serait consommateur de mémoire et de place sur le disque du fait que la 7° ligne se trouve en  #3800 soit presque a la fin du fichier

alors j'ai modifié la manière dont je stocke mon image de manière a ce que mes lignes soient stockées dans le bon ordre dans mon fichier.

du coup grace a ce vecteur effectivement je vais pouvoir me passer des 2 octets supplémentaires  (je viens de lire ta page a ce sujet)

par contre comme je ne veux pas afficher une image complète mais seulement la moitié je ne peux pas faire un LDIR sur une longueur de #2000 car  cela copierais a la suite les octets en mémoire et j'aurais des bandes d'image sur tout l’écran et non pas une moitié d’écran remplie

ou alors j'ai vraiment loupé un truc Smile

bon  je retourne a mes expérimentations Smile
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Sam 12 Déc - 21:42 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

case a écrit:
Ast a écrit:




du coup grace a ce vecteur effectivement je vais pouvoir me passer des 2 octets supplémentaires  (je viens de lire ta page a ce sujet)

par contre comme je ne veux pas afficher une image complète mais seulement la moitié je ne peux pas faire un LDIR sur une longueur de #2000 car  cela copierais a la suite les octets en mémoire et j'aurais des bandes d'image sur tout l’écran et non pas une moitié d’écran remplie

ou alors j'ai vraiment loupé un truc Smile

bon  je retourne a mes expérimentations Smile






Oui, tu vas pouvoir grâce à ce vecteur te passer des 2x200 octets supplémentaires, c'est certain. N'oublies pas cependant que ce vecteur système n'est utilisable que pour un écran de 80 caractères de large. 


Si tu veux afficher une image en "overscan", il te faudra toi aussi passer par une solution différente, comme présentée en préambule sur ce forum.


Je te conseille vivement, si tu veux afficher des morceaux d'images, d'utiliser Ocp ou iMPdraw pour sauvegarder ce que l'on appelle dans le jargon cpc, des windows ou .win!, des fenêtres d'images.

Grâce à celà tu pourras créer une routine générique pour afficher tes images où bon te semble. 


Tu as ici toutes les infos dont tu as besoin pour afficher ces images... L'important, c'est de connaitre la largeur et la hauteur de l'image à afficher ainsi que les coordonnées x et y... 
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 89

MessagePosté le: Dim 13 Déc - 02:34 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

il se passe quoi exactement quand on fait un push
est-ce que la valeur contenue dans le registre qu'on push reste tout de même dans ce registre

si je fais par exemple

ld HL,#c000
push hl

est-ce que hl contiens toujours #c000 je n'ai rien lu dans les docs en ma possession qui me signifiait le contraire du coup je suppose que oui
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Dim 13 Déc - 03:15 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

Quand tu fais un push, la valeur du registre est sauvegardé à l'adresse pointée par la pile.


Par exemple :


Code:

          .....
          Ld sp,#300
          Ld hl,#c000
          Push hl
          ....

A l'adresse #300-1, tu vas trouver #c0, à l'adresse #300-2, il y aura 0...
Un push hl, decremente de 2 le registre SP (la pile)
Tant que j'y suis, un pop hl incrémentera le registre SP de 2.
Cela peut être un excellent moyen de pré-remplir un sprite avec des valeurs définies.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 89

MessagePosté le: Dim 13 Déc - 20:34 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

ok ,) ca j'ai compris mais tu n'as pas vraiment répondu a ma question

ld hl,#c000
push hl

dans SP j'ai donc

#c000

mais est ce que j'ai toujours #c000 dans HL ?

je suppose que oui meme si rien ne l'indique dans le bouquin de ref que j'ai Smile
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Dim 13 Déc - 21:16 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

Oui tu as encore #c000 dans HL.
Ce n'est pas sp qui vaut #c000 mais l'adresse pointée par SP-2.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 15

MessagePosté le: Dim 13 Déc - 22:17 (2015)    Sujet du message: ***** Changement des couleurs Répondre en citant

 
 
Citation:
 mais est ce que j'ai toujours #c000 dans HL ?


Ta question est surprenante. Shocked
Lorsque tu fais LD (HL),A tu ne te demandes pas si A à changé, par exemple.

PUSH HL

C'est

DEC SP
LD (SP),H
DEC SP
LD (SP),L

A ne pas confondre avec EX (SP),HL :
LD (SP),L
LD (SP+1),H

Ah si on avait eu 2 piles avec le z80a...


Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 21:04 (2017)    Sujet du message: ***** Changement des couleurs

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Aller à la page: 1, 2  >
Page 1 sur 2

 
Sauter vers:  

Index | Panneau d’administration | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com