Index du forum




Un petit coup de main... Vous pouvez nous aider à mettre ce site à jour: n'hésitez pas à me contacter !!!

* Connexion   * Inscription

* FAQ
Nous sommes actuellement le 29 Nov 2025, 21:06

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Copie de sprite et mémoire pour les pros de l'ASM

Modérateur: poulette73



Publier un nouveau sujet Répondre au sujet  Page 1 sur 1
 [ 6 message(s) ] 
  Aperçu avant impression Sujet précédent | Sujet suivant 
Auteur Message
stephbb75
 Sujet du message : Copie de sprite et mémoire pour les pros de l'ASM
Message Publié : 07 Avr 2013, 19:27 
Hors-ligne
VIP
VIP

Inscription : 05 Avr 2012, 08:02
Message(s) : 197
Localisation : Sur terre, mais souvent dans les nuages !
Salut à tous,

Je fait appel à vous car je ne souhaite pas me prendre trop la tête avec l'asm :( (la y'en a qui vont s'en donner fond :P )

J'ai ce code pour copier un sprite, on y passe une adresse de départ écran ou copier, l'adresse du sprite qui est en mémoire de façon linéaire largeur et hauteur, est t'il correcte en terme de temps machine utilisé ?
Code :
   ; HL adresse  ecran
   ; C  Largeur
   ; B  hauteur         
   ; DE adrese du sprite

   B_Hauteur:
      PUSH BC
      LD B,C
      PUSH HL
   B_Largeur:
      LD A,(DE)
      LD (HL),A
      INC DE
      INC HL
      DJNZ B_Largeur
      POP HL
      LD A,H
      ADD #0x08
      LD H,A
      SUB #0xC0
      JP NC, Ligne
      LD BC, #0xC050
      ADD HL,BC
   Ligne:
      POP BC
      DJNZ B_Hauteur


Je voudrais partir de ce code pour faire l'inverse, copier une zone écran en mémoire de façon linéaire en y passent l'adresse mémoire écran, l'adresse mémoire ou seront copier les données, la largeur et la hauteur.

Autre question, j'ai fait ces deux code pour la copie de mémoire à mémoire, en lisent un peut tout sur le net, il faut mieux utiliser LDIR ou LDI ??
En gros lequel des deux est vraiment la plus rapide ?

Code :

Copie1:
   ;HL = adresse de départ
   ;DE = adresse de destination
   ;BC = nombre d’octets
      
        LDIR        ; Recopie de bloc
...

Copie2:
        ; HL = adresse de départ
        ; DE = adresse de destination
        ; BC = nombre d’octets + 1
      
BOUCLE:
        LDI           ; Copie une donnée
        JP PO,FIN   ; Sort de la boucle si BC = 1
        JP BOUCLE   ; Sinon continue
FIN:
...



Voila c'est tout pour le moment :)


Haut
 Profil  
 
Plissken
 Sujet du message : Re: Copie de sprite et mémoire pour les pros de l'ASM
Message Publié : 08 Avr 2013, 07:07 
Hors-ligne
Rulezzzz
Rulezzzz
Avatar de l’utilisateur

Inscription : 13 Nov 2007, 16:09
Message(s) : 911
Localisation : Gallifrey
Ldir prend 4 nops si ma mémoire est bonne,ldi 3.

Tu dois mettre autant de ldi que tu a d'octets a copier.

_________________
Tout le monde il es beau,tout le monde il est gentil .


Haut
 Profil  
 
stephbb75
 Sujet du message : Re: Copie de sprite et mémoire pour les pros de l'ASM
Message Publié : 08 Avr 2013, 08:13 
Hors-ligne
VIP
VIP

Inscription : 05 Avr 2012, 08:02
Message(s) : 197
Localisation : Sur terre, mais souvent dans les nuages !
Plissken a écrit :
Ldir prend 4 nops si ma mémoire est bonne,ldi 3.
Tu dois mettre autant de ldi que tu a d'octets a copier.


Ok, donc dans mon cas le plus rapide est bien LDIR, car pour LDI il faut faire un test pour continuer ou arrêter ce qui prendras plus de temps.


Haut
 Profil  
 
markerror
 Sujet du message : Re: Copie de sprite et mémoire pour les pros de l'ASM
Message Publié : 08 Avr 2013, 09:35 
Hors-ligne
VIP
VIP

Inscription : 04 Sep 2007, 19:43
Message(s) : 739
Bonjour,

La routine d'affichage de sprite est classique et tout à fait correcte. Tu peux l'améliorer un peu au niveau vitesse si tes sprites tiennent dans des fenêtres mémoire de 256 octets. Auquel cas, au lieu de faire un INC DE, tu peux utiliser INC E.

Tu peux aussi utiliser LDI en lieu et place de LD A,(DE) LD (HL),A INC HL INC DE en utilisant le registre A comme compteur de boucle. Le gain sera intéressant.

T&J/GPA


Haut
 Profil  
 
fano
 Sujet du message : Re: Copie de sprite et mémoire pour les pros de l'ASM
Message Publié : 08 Avr 2013, 18:46 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 15 Août 2008, 13:00
Message(s) : 968
Localisation : Troyes, France
stephbb75 a écrit :
Plissken a écrit :
Ldir prend 4 nops si ma mémoire est bonne,ldi 3.
Tu dois mettre autant de ldi que tu a d'octets a copier.


Ok, donc dans mon cas le plus rapide est bien LDIR, car pour LDI il faut faire un test pour continuer ou arrêter ce qui prendras plus de temps.
Oui , LDI est interessant si tu déroules la boucle.Tiens, ça pourrait t'être utile : http://www.grimware.org/doku.php/documentations/devices/z80

_________________
"NOP" tel est le programme parfait ! court, rapide, lisible et sans bugs (connus)


Haut
 Profil  
 
Megachur
 Sujet du message : Re: Copie de sprite et mémoire pour les pros de l'ASM
Message Publié : 08 Avr 2013, 20:04 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 12 Juin 2008, 20:29
Message(s) : 1726
L'intérêt d'un LDIR c'est que la boucle de copie est incluse dans cette instruction (transfert bc octet de hl vers de avec à la fin bc =0, hl=hl+bc et de=de+bc).
pour utiliser LDI qui est plus rapide, il faut que la largeur soit toujours la même. sinon le test de fin sera supérieur à un LDIR !

ld a,(hl);ld (de),a;inc hl:inc de peut effectivement être remplacé par un LDI (attention si on se sert de b ou c pour une boucle, il faut incrémenter bc (ou c si b différent de 0 avant).

d'une façon générale, c'est valable pour tout les langages, il faut optimiser en premier les boucles qui prennent le plus de temps machine !

l'idéal est donc de coder ton programme, de le tester et d'en être pleinement satisfait (=un programmeur heureux) : ensuite si tu as un pb de perf, tu optimises d'abord les boucles (en les éliminants) dans la limite de la mémoire dispo !
ex : (j'ai compté le temps machine en nop pour que tu comprennes le gain)

ld hl,&c000 ; 3
ld de,&4000; 3
ld bc,&0003 ; 3
ldir ; 6*2+5 = 17
total : 26

ld hl,&c000 ; 3
ld de,&4000; 3
ldi ; 5
ldi ; 5
ldi ; 5
total : 21
j'ai gagné l'init de bc (-3) + la boucle du ldir pour deux octets (-2)
sinon, si j'ai pas besoin d'inc hl et de au dernier ldi, je peux remplacer par ld a,(hl), ld (de),a et j'ai gagné encore 1

en asm, on peut écrire cela pour répéter 3 fois LDI (utile quand tu en as bcp plus ;-)) :
REPEAT 3
LDI
REND

Les bons et vrais codeurs te diront qu'il faut écrire le code en étant déjà optimisé à fond : mais je pense que c'est une vieille légende cpcienne !!! :biere: :magic: :biere:


Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  Page 1 sur 1
 [ 6 message(s) ] 

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Google [Bot] et 16 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Aller vers :  
Powered by phpBB® Forum Software © phpBB Group
Traduit en français par Maël Soucaze.