Amstrad PlusDécouverte de la gamme Old et Plus des Cpc d'Amstrad.
Sujet précédent :: Sujet suivant |
Auteur |
Message |
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Jeu 17 Sep - 14:09 (2015) Sujet du message: Optimisation code Z80 |
|
|
Je me suis décidé à créer ici une nouvelle rubrique que j'ai appelé, "Optimisation Z80". Je souhaiterais donc, si c'est possible que vous y mettiez tous les petits subterfuges que vous utilisez lorsque vous réalisez une routine. Puisqu'il faut commencer, commençons par la multiplication par 256.
Pour multiplier a par 256 et récupérer le contenu dans hl, cela revient à ajouter 8 fois le contenu de hl après avoir récupéré le contenu de a dans l, h étant à 0.
soit la routine suivante :
Code: | ld l,a Ld h,0 Add hl,hl ; hl x2 Add hl,hl ; hl x4 Add hl,hl ; hl x8 Add hl,hl ; hl x16 Add hl,hl ; hl x32 Add hl,hl ; hl x64 Add hl,hl ; hl x128 Add hl,hl ; hl x256
|
Rappelons pour mémoire que l'instruction add hl,hl prends 3us soit un total de 24us + 3us pour multiplier par 256.
Mais, peut-on faire plus court ? Oui. Il suffit juste de passer le registre a en poids fort au lieu du poids faible, et le tour est joué. Le contenu de a sera automatiquement multiplié par 256, vous voyez pourquoi ?
Voici donc la multiplication la plus rapide par 256 :
Code: | Ld h,a ; charge a dans h Ld l,0
|
Pour cette routine, nous avons un total de 3us. A compléter... _________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
Dernière édition par Ast le Dim 26 Juin - 17:35 (2016); édité 2 fois
|
|
Revenir en haut |
|
|
Demoniak
En ligne
Inscrit le: 10 Sep 2015 Messages: 49
Localisation: Dunkerque Point(s): 21 Moyenne de points: 0,43
|
Posté le: Lun 7 Déc - 18:26 (2015) Sujet du message: Optimisation code Z80 |
|
|
Un truc que j'utilise souvent dans une boucle 16 bits, avec BC comme compteur de boucle, et HL qui doit être incrémenté à chaque pas : au lieu de faire ceci :
Code: |
LD HL,ValeurDepart LD BC,Compteur Boucle: INC HL DEC BC LD A,B OR C JR NZ,Boucle
| Il vaut mieux faire :
Code: |
LD HL,ValeurDepart LD BC,Compteur Boucle: CPI JP PE,Boucle
|
Le CPI faisant un CP (HL), INC HL, DEC BC, et positionne le FLAG V tant que BC != 0
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Lun 7 Déc - 18:36 (2015) Sujet du message: Optimisation code Z80 |
|
|
En gros, tu gagnes 2 us dans ta boucle, c'est ça ? Très bonne astuce Ludo ! _________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
Demoniak
En ligne
Inscrit le: 10 Sep 2015 Messages: 49
Localisation: Dunkerque Point(s): 21 Moyenne de points: 0,43
|
Posté le: Lun 7 Déc - 18:43 (2015) Sujet du message: Optimisation code Z80 |
|
|
Ast a écrit: | En gros, tu gagnes 2 us dans ta boucle, c'est ça ? Très bonne astuce Ludo !
|
Oui c'est ça, et en plus ça prends moins de place
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Lun 7 Déc - 19:00 (2015) Sujet du message: Optimisation code Z80 |
|
|
Tu m'étonnes... Si t'en as d'autres n'hésites pas. _________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
Publicité
|
Posté le: Lun 7 Déc - 19:00 (2015) Sujet du message: Publicité |
|
|
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Ven 11 Déc - 18:45 (2015) Sujet du message: Optimisation code Z80 |
|
|
Pour gagner un peu temps pour vos ruptures, j'ai trouvé une façon rapide de mettre certains registres en overflow. Par exemple, l'overflow du registre 7 :
Code: | ld bc,#bc07 out (c),c ; selection du reg 7 inc b ; b=#bd out (c),b ; envoie de la valeur overflow -> #bd
|
Avec ce système, on peut gagner des registres... _________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Lun 14 Déc - 19:39 (2015) Sujet du message: Optimisation code Z80 |
|
|
Voici une petite astuce de programmation que j'utilise pour gagner un peu d'espace mémoire. Je l'ai mis dans le sujet "Optimisation code z80" alors que j'aurais du créer une rubrique "Optimisation mémoire". Enfin, à vous de me dire.
Lorsque l'on veut faire une boucle d'attente de synchro pour des rasters, par exemple, mais pas que, nous trouvons généralement une routine du type :
Code: | ...... ld b,nbli ; nombre de ligne d'attente boucle fill 60,0 ; recopie 60x l'instruction 'nop' djnz boucle ; on reboucle ......
|
Cette boucle permet une attente de x lignes qui font 64us, donc pour une synchro précise de raster par exemple. Elle prends également 64 octets dans la mémoire de votre Cpc.
Je trouve plus sympa d'utiliser la routine suivante, qui fait la même chose mais prends moins de place.
Code: | ..... ld b,nbli ; nombre de ligne d'attente boucle ld iy,#c000 ; on charge iy avec une valeur aléatoire 8** ex (sp),iy ; on recopie 8x l'instruction ex (sp),iy djnz boucle .....
|
Ici nous utilisons 22 octets au lieu des 64 octets utilisés sur la routine précédente. Bien sûr, le résultat reste identique. On noteras ici que l'instruction ex (sp),iy prends 7 us x 8 -> 56 us et le 'ld iy,#c000' en prends 4. On ajoute à cela les 4us prises par l'instruction 'djnz' et on arrive pile poil à 64 us, comme par hasard, le temps que prends l'affichage d'une ligne.
_________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
fgbrain
Hors ligne
Inscrit le: 01 Juin 2015 Messages: 17
Localisation: Greece Point(s): 1 Moyenne de points: 0,06
|
Posté le: Dim 26 Juin - 11:55 (2016) Sujet du message: Optimisation code Z80 |
|
|
add hl,hl takes 3 ms/nops not 2 as you state in your first post!!!
Another very useful optimization (based on your post) when multiply by 64:
normal slow routine is:
Code: | ld l,(hl) ld h,0 add hl,hl ; *2 add hl,hl ; *4 add hl,hl ; *8 add hl,hl ; *16 add hl,hl ; *32 add hl,hl ; *64
|
FAST equivalent:
Code: | ld h,(hl) ld l,0 ; *256 srl h rr l srl h rr l ; 256/4 = *64
|
which takes only 2+2+2+2+2+2=12 ms instead of: 2+2+3+3+3+3+3+3=22 ms!!!
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Dim 26 Juin - 17:30 (2016) Sujet du message: Optimisation code Z80 |
|
|
fgbrain a écrit: | add hl,hl takes 3 ms/nops not 2 as you state in your first post!!!
Another very useful optimization (based on your post) when multiply by 64:
normal slow routine is:
Code: | ld l,(hl) ld h,0 add hl,hl ; *2 add hl,hl ; *4 add hl,hl ; *8 add hl,hl ; *16 add hl,hl ; *32 add hl,hl ; *64
|
FAST equivalent:
Code: | ld h,(hl) ld l,0 ; *256 srl h rr l srl h rr l ; 256/4 = *64
|
which takes only 2+2+2+2+2+2=12 ms instead of: 2+2+3+3+3+3+3+3=22 ms!!!
|
Yes, you're right. "Add hl,hl" takes 3 nops... I'm happy to read you fgBrain and i like your optimization. Error is now corrected. Be happy! _________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
roudoudou
Hors ligne
Inscrit le: 14 Juil 2016 Messages: 430
Localisation: LYON Point(s): 50 Moyenne de points: 0,12
|
|
Revenir en haut |
|
|
Publicité
|
Posté le: Jeu 29 Sep - 11:07 (2016) Sujet du message: Publicité |
|
|
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Jeu 29 Sep - 11:21 (2016) Sujet du message: Optimisation code Z80 |
|
|
Pas mal Roudoudou
J'aime particulièrement le "Fast" LDIR ! _________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Jeu 29 Sep - 11:36 (2016) Sujet du message: Optimisation code Z80 |
|
|
--- Fast Ldir ou comment remplir tous ses sprites hard sans utiliser l'instruction ldir
Code: | ld bc,256 Loop: ldi ; 16x ... jp pe,Loop ; Loop until bc = zero
|
_________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
roudoudou
Hors ligne
Inscrit le: 14 Juil 2016 Messages: 430
Localisation: LYON Point(s): 50 Moyenne de points: 0,12
|
Posté le: Jeu 29 Sep - 13:22 (2016) Sujet du message: Optimisation code Z80 |
|
|
Si on a de la place en mémoire (au hasard, des ROM de cartouche) il me semble que le remplissage à la pile doit bien tartiner aussi!
ld bc,#1234 ; 3 nops push bc ; 4 nops
contre 10 nops pour deux LDI
évidemment, c'est très gourmand en mémoire et il faut couper les interruptions!
avec un parser optimisé on peut aussi se garder sous le coude des valeurs récurrentes dans de,hl,ix,iy et même les secondaires avec EXX pour gagner encore plus de nops!
|
|
Revenir en haut |
|
|
fgbrain
Hors ligne
Inscrit le: 01 Juin 2015 Messages: 17
Localisation: Greece Point(s): 1 Moyenne de points: 0,06
|
Posté le: Sam 1 Oct - 01:02 (2016) Sujet du message: Optimisation code Z80 |
|
|
Hi again,
Faster than LDI/ LDD ? Yes it is possible!!!
Say normal routine to copy 20 bytes: (Short and sweet..)
Citation: |
ld de,dest+40 ;3 ld hl,source+40;3 ldd (*20 times) ;5*20=100 ;106 ms TOTAL
|
This is the fastest way to copy 20 bytes I believe:
Code: |
ld (replacesp+1),sp ;6 ld sp,source+40 ;3 pop iy;5 pop ix;5 pop hl;3 pop de;3 pop bc;3 pop af;3 exx ;1 ex af,af';1 st33 pop hl;3 pop de;3 pop bc;3 pop af;3 ld sp,dest+40;3 st48 push af;4 push bc;4 push de;4 push hl;4 exx;1 ex af,af';1 st66 push af;4 push bc;4 push de;4 push hl;4 st82 push ix;5 push iy;5 replacesp: ld sp,0;3 ; 95 ms TOTAL [st=subtotal]
|
That's almost 12% faster but uses all register set and stack.. You choose which depends on your needs!
|
|
Revenir en haut |
|
|
Ast Administrateur
Hors ligne
Inscrit le: 05 Sep 2014 Messages: 3 169 Point(s): 609 Moyenne de points: 0,19
|
Posté le: Sam 1 Oct - 01:35 (2016) Sujet du message: Optimisation code Z80 |
|
|
Pop ix and pop iy only take 4 nops... and 5 nops if you use push.... _________________ Ast/iMPACT
Par le pouvoir du crâne ancestral....
|
|
Revenir en haut |
|
|
|
|