CPC Rulez
https://cpcrulez.fr/forum/

Copie de sprite et mémoire pour les pros de l'ASM
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=5045
Page 1 sur 1

Auteur :  stephbb75 [ 07 Avr 2013, 19:27 ]
Sujet du message :  Copie de sprite et mémoire pour les pros de l'ASM

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 :)

Auteur :  Plissken [ 08 Avr 2013, 07:07 ]
Sujet du message :  Re: Copie de sprite et mémoire pour les pros de l'ASM

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.

Auteur :  stephbb75 [ 08 Avr 2013, 08:13 ]
Sujet du message :  Re: Copie de sprite et mémoire pour les pros de l'ASM

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.

Auteur :  markerror [ 08 Avr 2013, 09:35 ]
Sujet du message :  Re: Copie de sprite et mémoire pour les pros de l'ASM

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

Auteur :  fano [ 08 Avr 2013, 18:46 ]
Sujet du message :  Re: Copie de sprite et mémoire pour les pros de l'ASM

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

Auteur :  Megachur [ 08 Avr 2013, 20:04 ]
Sujet du message :  Re: Copie de sprite et mémoire pour les pros de l'ASM

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:

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/