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 ![]() ![]() 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. |
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 !!! ![]() ![]() ![]() |
Page 1 sur 1 | Le fuseau horaire est UTC+1 heure |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |