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 

Optimisation code Z80
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
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Jeu 17 Sep - 14:09 (2015)    Sujet du message: Optimisation code Z80 Répondre en citant

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/iMP4CT

"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
Publicité






MessagePosté le: Jeu 17 Sep - 14:09 (2015)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Demoniak


Hors ligne

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

MessagePosté le: Lun 7 Déc - 18:26 (2015)    Sujet du message: Optimisation code Z80 Répondre en citant

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: 1 917

MessagePosté le: Lun 7 Déc - 18:36 (2015)    Sujet du message: Optimisation code Z80 Répondre en citant

En gros, tu gagnes 2 us dans ta boucle, c'est ça ?
Très bonne astuce Ludo !
_________________
Ast/iMP4CT

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


Revenir en haut
Demoniak


Hors ligne

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

MessagePosté le: Lun 7 Déc - 18:43 (2015)    Sujet du message: Optimisation code Z80 Répondre en citant

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 Smile


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Lun 7 Déc - 19:00 (2015)    Sujet du message: Optimisation code Z80 Répondre en citant

Tu m'étonnes... Si t'en as d'autres n'hésites pas.
_________________
Ast/iMP4CT

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


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Ven 11 Déc - 18:45 (2015)    Sujet du message: Optimisation code Z80 Répondre en citant

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/iMP4CT

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


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Lun 14 Déc - 19:39 (2015)    Sujet du message: Optimisation code Z80 Répondre en citant

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/iMP4CT

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


Revenir en haut
fgbrain


Hors ligne

Inscrit le: 01 Juin 2015
Messages: 7
Localisation: Greece

MessagePosté le: Dim 26 Juin - 11:55 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

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!!!    Okay


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Dim 26 Juin - 17:30 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

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!!!    Okay





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/iMP4CT

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


Revenir en haut
roudoudou


Hors ligne

Inscrit le: 14 Juil 2016
Messages: 149
Localisation: LYON

MessagePosté le: Jeu 29 Sep - 11:07 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

Pas mal d'optimisations en tous genre sur le Z80 qu'on trouve sur des sites pour calculatrice TI, qui possède aussi un Z80 


http://wikiti.brandonw.net/index.php?title=Z80_Optimization



http://z80-heaven.wikidot.com/optimization


ici sur une page MSX, un fastLDIR amusant (mais pas utilisable en ROM)


http://map.grauw.nl/articles/fast_loops.php




Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Jeu 29 Sep - 11:21 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

Pas mal Roudoudou Okay

J'aime particulièrement le "Fast" LDIR !
_________________
Ast/iMP4CT

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


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Jeu 29 Sep - 11:36 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

--- 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/iMP4CT

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


Revenir en haut
roudoudou


Hors ligne

Inscrit le: 14 Juil 2016
Messages: 149
Localisation: LYON

MessagePosté le: Jeu 29 Sep - 13:22 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

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: 7
Localisation: Greece

MessagePosté le: Sam 1 Oct - 01:02 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

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! Okay


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 1 917

MessagePosté le: Sam 1 Oct - 01:35 (2016)    Sujet du message: Optimisation code Z80 Répondre en citant

Pop ix and pop iy only take 4 nops... and 5 nops if you use push....
_________________
Ast/iMP4CT

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


Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 21:05 (2017)    Sujet du message: Optimisation code Z80

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 + 2 Heures
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