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 

premier code ASM
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
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Mar 15 Déc - 02:51 (2015)    Sujet du message: premier code ASM Répondre en citant

et voila , mon premier programme en ASM Mr. Green

même si je suis sur qu'on peux faire mieux, je suis content d'avoir compris certaines choses comme la pile

petit dsk a télécharger pour ceux qui veulent voir le résultat Smile

tapez run"loa

et voila mon code ^^

 
Code:

org #9000         ; implentation du programme en memoire
ld DE,#C000       ; adresse de l'ecran
LD HL,#4000       ; adresse de l'image
ld b,100
loop
push bc           ; sauve le compteur pour la boucle
push DE           ; sauve l'adresse du debut de ligne
ld bc,80          ; charge le nombre d'octets a afficher
ldir              ; affiche les octets
pop DE            ; retabli l'adresse d'origine
ex HL,DE          ; inverse DE et HL
call #BC26        ; calcule le debut de la ligne suivante
ex HL,DE          ; inverse DE et HL
pop bc            ; retabli le compteur
djnz loop         ; si le compteur n'est pas a zero, boucle
ret               ; retourne au basic



merci pour vos conseils et vos réponses a mes questions débiles ^^
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
Publicité






MessagePosté le: Mar 15 Déc - 02:51 (2015)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 663

MessagePosté le: Mar 15 Déc - 09:37 (2015)    Sujet du message: premier code ASM Répondre en citant

Tu as compris la trame, c'est bien ;-)
Moi, à ta place je ferai un memory &3fff avant de loader mon fichier en &9000 car si tu as des roms, comme beaucoup de personnes, tu auras un beau memory full.
_________________
Ast/iMP4CT

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


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Mar 15 Déc - 12:32 (2015)    Sujet du message: premier code ASM Répondre en citant

argh j'avais mi cette ligne mais j'ai du l’écrasée en ajoutant autre chose ...



c'est corrigé 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 663

MessagePosté le: Mar 15 Déc - 17:22 (2015)    Sujet du message: premier code ASM Répondre en citant

Tu veux arriver à faire quoi au juste ?
_________________
Ast/iMP4CT

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


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Mar 15 Déc - 21:18 (2015)    Sujet du message: premier code ASM Répondre en citant

c'est toujours dans l'optique de programmer un jeu d'aventure ou la partie supérieure de l’écran serait dédiée a l'affichage et la partie inférieure aune zone de description textuelle/ dialogues etc...
c'est pour cela que je voulais afficher une moitié d'image.
_________________
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: Mer 16 Déc - 19:37 (2015)    Sujet du message: premier code ASM Répondre en citant

N'oublie pas que la seule moitié de l'écran (non reformaté) occupe 8000 octets (les 2/3 10640 octets) et que tu es sur une machine ou la taille standard d'une face de disquette correspond quasiment à l'intégralité de la ram disponible de la machine. Selon le jeu que tu vas vouloir faire, tu vas vite être confronté à la notion de compression d'image...

Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Mer 16 Déc - 22:41 (2015)    Sujet du message: premier code ASM Répondre en citant

oui , je sais tout ca Smile c'est pourquoi j'ai opté pour des demi écrans car avec 8k on a deja une vingtaine par face de disquettes ce qui peut faire pas mal de lieux si on considère que certains écrans peuvent êtres réutilisés plusieurs fois par l'ajout d'objets par exemple une pièce vide peut avoir la même base qu'une chambre ou une cuisine en fonction du mobilier donc des écrans de 8k plus des objets que l'on dessine par dessus contenus dans des fichiers moins gros pour u jeu d'aventure en 2 disquettes par exemple recto/verso ce peut etre  jouable il me semble

actuellement j'arrive a superposer 2 images en affichant uniquement les octets <> 0 du coup la couleur de fond est transparente. du fait de la manière dont est codé la mémoire écran et l'entrelacement des pixels
a certains endroits de mon image j'ai toutefois des pixels de la couleur de fond car mixés avec une autre couleur
quelle méthode serait employable pour ne pas dessiner la couleur 0 et la rendre vraiment transparente?

je suis sur une piste avec des masques binaires

lire l'octet a afficher le passer a un premier masque binaire   and  01010101
si la valeur restante est zero  on transforme l'octet lu en le mixant avec la destination et le masque inversé
10101010 et afficher le pixel
sinon le même avec le second pixel
masque and 10101010 et le mixer avec la destination 01010101

du coup ça rallonge le temps de calcul d'une operation

ou y a t'il une autre méthode ? je ne souhaite pas créer de masques graphiques ce serait prendre de la place Smile



voila ce que çà donne, mon test d'affichage de deux images superposées j'aimerais virer les pixels que l'on vois en bordure du monstre (très visibles sur le tentacule a gauche)
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Jeu 17 Déc - 00:52 (2015)    Sujet du message: premier code ASM Répondre en citant

je me réponds a moi même

bon actuellement j'affiche deux images de 80 octets de large et 100 pixels de haut c'est fixe je vais essayer de changer cela Smile

je pense que ce doit être optimisable  Smile

Code:

 ;################################################################
;#                                                              #
;#               AFFICHE Avec LA COULEUR ZERO                   #
;#                                                              #
;################################################################
org #9000         ; implentation du programme
ld DE,#C000       ; adresse de l'ecran
LD HL,#4000       ; adresse de l'image
ld b,100
loop
push bc           ; sauve le compteur pour la boucle
push DE           ; sauve l'adresse du debut de ligne
ld bc,80          ; charge le nombre d'octets a afficher
ldir              ; affiche les octets
pop DE            ; retabli l'adresse d'origine
ex HL,DE          ; inverse DE et HL
call #BC26        ; calcule le debut de la ligne suivante
ex HL,DE          ; inverse DE et HL
pop bc            ; retabli le compteur
djnz loop         ; si le compteur n'est pas a zero, boucle
ret               ; retourne au basic
;################################################################
;#                                                              #
;#               AFFICHE SANS LA COULEUR ZERO                   #
;#                                                              #
;################################################################
ld DE,#C000       ; adresse de l'ecran
LD HL,#4000       ; adresse de l'image
ld b,100
loop2
push bc           ; sauve le compteur pour la boucle
push DE           ; sauve l'adresse du debut de ligne
ld bc,80          ; charge le nombre d'octets a afficher
TRANSF:
ld a,0            ; element de comparaison
cp (hl)           ; compare a a l'octet contenu a hl
jr z,nodraw       ; si = 0 on ne dessine pas et on saute a l'etiquette nodraw
;-------------------------------   OCTET NON VIDE    -------------------------
ld a,(hl)         ; on met l'octet source dans a
and 85           ; applique le masque binaire 
cp 0              ; compare a zero 
jr nz,case2       ; si 2 nombres different pas egal a zero donc on vas a case2
push bc
ld a,(hl)         ; on met l'octet source dans a
and 170           ; applique le masque binaire
ld b,a
ld a,(de)         ; on charge la destination
and a,85            ; on applique le masque 
or b
pop bc
jp drawthis       ; on dessine le resultat
case2
ld a,(hl)         ; sinon on met l'octet source dans a
and 170            ; on applique le masque 
cp 0              ; pixel vide ? 
jr z,domask       ; oui on masque le pixel
LD A,(HL)         ; sinon on met l'octet dans a 
jp drawthis
domask
push bc
ld a,(hl)         ; on met l'octet source dans a
and 85
ld b,a            ; sinon on sauve le contenu de a
ld a,(de)         ; on charge la destination
and 170            ; on applique le masque 
or b
pop bc
drawthis
LD (DE),A         ; et on l'ecrit sur l'ecran
nodraw            
INC HL            ; on ajoute un a hl
INC DE            ; on ajoute un a de
DEC BC            ; on decremente BC
LD A,B            ; on charge A avec B ! pourquoi doit on faire ca je ne comprend pas 
OR C              ; ou logique C       ! mais cela ne fonctionne pas si on ne le fais pas
JR NZ,TRANSF
pop DE            ; retabli l'adresse d'origine
ex HL,DE          ; inverse DE et HL
call #BC26        ; calcule le debut de la ligne suivante
ex HL,DE          ; inverse DE et HL
pop bc            ; retabli le compteur
djnz loop2         ; si le compteur n'est pas a zero, boucle
ret               ; retourne au basic




_________________
it's nice to be important but it's more important to be nice


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Jeu 17 Déc - 02:31 (2015)    Sujet du message: premier code ASM Répondre en citant

longshot j'ai vu que tu avais codé des rsx par le passé j'aimerais bien transformer mes routines en rsx afin de pouvoir spécifier des paramètres depuis le basic j'ai vu un code sur le cpc wiki
http://www.cpcwiki.eu/index.php/Programming:An_example_to_define_a_RSX
mais cela me semble incomplet il n'est pas expliqué par exemple comment spécifier des paramètres par exemple un nom de fichier ou des coordonnés
existe t-il des infos ailleurs sur la manière de procéder ou bien je me trompe de manière de voir les choses et les paramètres ne sont pas définissables dans le code de la rsx? ?
et sont a récupérer quelque part en mémoire ?
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
Demoniak


Hors ligne

Inscrit le: 10 Sep 2015
Messages: 16
Localisation: Dunkerque

MessagePosté le: Jeu 17 Déc - 06:52 (2015)    Sujet du message: premier code ASM Répondre en citant

Tu peux trouver des informations sur le passage de paramètres ici :
http://www.cpcwiki.eu/index.php/Technical_information_about_Locomotive_BASIC

En gros, tu récupères dans le registre A le nombre de paramètres,
dans (IX+n*2) et (IX+n*2+1) tu as le paramètre (2*maxparam-n)/2 (marparm étant le nombre de paramètres, n le numéro du paramètre à récuperer)

Un exemple pour 2 paramètres :
A vaudra 2,
le premier paramètre sera au adresses (IX+3) et (IX+2), le second paramètre au adresses (IX+1) et (IX+0).
Une petite astuce également: le dernier paramètre se trouve également dans le registre DE


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Jeu 17 Déc - 19:29 (2015)    Sujet du message: premier code ASM Répondre en citant

merci je vais aller voir tout ca 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: Ven 18 Déc - 01:44 (2015)    Sujet du message: premier code ASM Répondre en citant

Tu as bien compris la notion de masque, mais la réalisation est un peu barbare à cause de ton manque de pratique du z80a
Tu devrais utiliser l'hexadécimal, voir directement le binaire dans ton source lorsque tu manipules des masques.

Pour ton questionnement sur LD A,B / OR C , c'est un moyen classique que deux registres valent 0 car l'instruction BC ne positionne pas le bit Z.
Si B=0 et que C=0, on a 0 OR 0 qui positionne le bit Z=1
Un LD ne positionne en général pas les flags (sauf dans quelques cas rares comme LD A,R)
Une opération logique ou arithmétique si, sauf pour certaines instructions comme DEC BC qui travaillent sur 16 bits

En conséquence, tu n'as pas besoin de faire un cp 0 lorsque tu viens de faire une opération logique ou arithmétique sur 8 bits
and %01010101
jr nz, ....

A première vue, tu testes si tu as un pixel gauche, un pixel droit, ou les deux pixels à afficher.
Lorsque tu es sur un pixel droit ou gauche, il n'y a aucun intérêt à masquer ton octet puisque tu sais déjà que l'autre pixel est à 0!

De manière plus générale, tu passes beaucoup de temps à tester chaque octet, mais la rapidité n'est pas forcément très importante pour un jeu d'aventure.
Si tu étais amené à réfléchir à la compression de tes objets tu pourrais alors optimiser la place ET la rapidité d'affichage en définissant les zones sans trou.

Concernant les RSX, je pense que Demo t'a quasiment tout dit.
Si tu veux que ta fonction RSX renvoie une valeur à ton programme basic, il te faut passer une variable "par adresse" à la RSX
En basic, cela t'impose déjà "déclarer" la variable en l'initialisant  : toto%=0
Et lorsque tu passes cette variable à la RSX : |MARSX,@toto%
Le code exécuté par la RSX dispose donc dans ses paramètres de l'adresse ou est stocké la valeur de la variable pour pouvoir la modifier.


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Ven 18 Déc - 13:55 (2015)    Sujet du message: premier code ASM Répondre en citant

merci pour les conseils Smile je vais revoir ce code ce soir si j'ai le temps Smile 
_________________
it's nice to be important but it's more important to be nice


Revenir en haut
case


Hors ligne

Inscrit le: 19 Nov 2015
Messages: 46

MessagePosté le: Mar 22 Déc - 00:54 (2015)    Sujet du message: premier code ASM Répondre en citant

salut, j'ai réussi a mettre tout cela en rsx mais j'ai pas trop réussi a optimiser mon code je sèche

 
Citation:
 En conséquence, tu n'as pas besoin de faire un cp 0 lorsque tu viens de faire une opération logique ou arithmétique sur 8 bits
and %01010101
jr nz, ....
CA j'ai compris je gagne une instruction pas de soucis Smile
Citation:

 A première vue, tu testes si tu as un pixel gauche, un pixel droit, ou les deux pixels à afficher.
Lorsque tu es sur un pixel droit ou gauche, il n'y a aucun intérêt à masquer ton octet puisque tu sais déjà que l'autre pixel est à 0!
ça par contre j'ai beau retourner le problème dans tout les sens je ne vois pas comment je peux faire je dois avoir un bug de logique dans mon cerveau ou une subtilité m'échappe ...

un octet contient 2 pixels

actuellement je commence par regarder si l'octet = 0 dans ce cas je ne dessine rien car 0 = 2 pixels vides
dans le cas contraire (au moins un des deux pixel est allumé mais aussi peut être les deux)
je teste le pixel de gauche en utilisant un masque binaire %10101010 si j'ai zéro je ne dessine que le pixel de droite  puis je passe a l'octet suivant
dans le cas contraire (je n'ai pas zero)
je teste le pixel de droite en utilisant un masque binaire %01010101 si j'ai zéro je ne dessine que le pixel de gauche
dans le cas contraire
je dessine les deux pixels et je passe a l'octet suivant

 je ne vois pas comment me passer du test d'un des deux pixels gauche ou droite pour déterminer si l'autre est a zéro ou si les deux sont allumés

après si quelqu'un a une astuce je suis preneur 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: Mar 22 Déc - 11:33 (2015)    Sujet du message: premier code ASM Répondre en citant

Je n’ai pas écrit que tu pouvais te passer du test, mais que tu n’as pas besoin d’effacer un pixel qui est déjà à 0
Tu fais un test pour déterminer qu'un des deux pixels est vide, puis tu annules ce pixel vide, ce qui est pour le moins inutile.

Tu peux remplacer
 
push bc
ld a,(hl)         ; on met l'octet source dans a
and 170           ; applique le masque binaire
ld b,a
ld a,(de)         ; on charge la destination
and a,85            ; on applique le masque 
or b
pop bc
 
par
ld a,(de) ; tu lis ton écran

and %10101010 ; tu fais un trou

or (hl) ; et tu appliques l'objet (dont seul le pixel a affecter n'est pas vide, puisque tu viens de le tester)


Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 09:03 (2017)    Sujet du message: premier code ASM

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 + 1 Heure
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