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 30 Nov 2025, 15:52

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


test fin de table

Modérateur: poulette73



Publier un nouveau sujet Répondre au sujet  Page 1 sur 2
 [ 28 message(s) ]  Aller vers la page 1, 2  Suivant
  Aperçu avant impression Sujet précédent | Sujet suivant 
Auteur Message
Megachur
 Sujet du message : test fin de table
Message Publié : 03 Juin 2011, 07:46 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 12 Juin 2008, 20:29
Message(s) : 1726
Bonjour à tous, codeurs émérites de tout poil (et poilette) !

je me demandais comment optimiser ce code (en timing) :

le but est de voir si le compteur dépasse la fin de la table et si oui, le remettre au début

Code :
table_adr_ptr equ $ +1
   ld hl,table_adr
   etc...
   inc hl

   ld a,l
   cp table_adr_end
   jr nz,label_adr_nz
   ld a,h
   cp table_adr_end/&100
   jr nz,label_adr_nz
   ld register_hl,table_adr
label_adr_nz
   ld (table_adr_ptr),hl



Merci d'avance de vos idées, suggestions et aides !!! :biere:


Haut
 Profil  
 
TOUKO
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 09:07 
Hors-ligne
Rulezz
Rulezz
Avatar de l’utilisateur

Inscription : 12 Juil 2010, 13:36
Message(s) : 169
Bah je connais pas l'asm z80 mais ..

Si ta table est de longueur fixe, tu initialise une variable de la longueur de ta table que tu décrémentes ..
A 0, tu es à la fin !! :)
Ou tu peux tester si l'adresse de ton pointeur, correspond à celle de la fin de ta table ..

Si elle est variable, je mettrai un caractère particulier de fin de table ..


Haut
 Profil  
 
Demoniak
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 09:11 
Hors-ligne
VIP
VIP

Inscription : 15 Oct 2009, 18:07
Message(s) : 236
Localisation : Dunkerque
Si tu peux utiliser le registre BC, le top c'est de faire un CPI qui fait en une seule instruction
- un INC HL
- un DEC BC
- positionne le flag V tant que BC!=0

_________________
http://demoniak-contrib.forumactif.com/


Haut
 Profil  
 
TOUKO
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 09:33 
Hors-ligne
Rulezz
Rulezz
Avatar de l’utilisateur

Inscription : 12 Juil 2010, 13:36
Message(s) : 169
Demoniak a écrit :
Si tu peux utiliser le registre BC, le top c'est de faire un CPI qui fait en une seule instruction
- un INC HL
- un DEC BC
- positionne le flag V tant que BC!=0


Ah oui c'est pas mal comme instruction ça ..

CPI, ne fait que comparer et incrémenter non ..

Ce serai pas plutôt CPIR pour faire tout ce que tu as dit ???


Haut
 Profil  
 
Megachur
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 09:42 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 12 Juin 2008, 20:29
Message(s) : 1726
Demoniak a écrit :
Si tu peux utiliser le registre BC, le top c'est de faire un CPI qui fait en une seule instruction
- un INC HL
- un DEC BC
- positionne le flag V tant que BC!=0


euh...

CPI ça compare le contenu de A avec celui de (HL)
puis ça fait effectivement inc hl, dec bc

mais là, je cherche à optimiser la routine en terme de timing...
je vais remplacer le "etc." par un exemple + le timing en première colonne :

Code :
table_adr_ptr equ $ +1
3   ld hl,table_adr
2   ld e,(hl)
2   inc hl
2   ld d,(hl)
2   inc hl
1   ld a,l
2   cp table_adr_end
3/2   jr nz,label_adr_nz
1   ld a,h
2   cp table_adr_end/&100
3/2   jr nz,label_adr_nz
3   ld hl,table_adr
label_adr_nz
5   ld (table_adr_ptr),hl
---
22 mini /29 max

...
table_adr
   dw &1212
   dw &2121
...
table_adr_end



je précise aussi que la table est de longueur variable et ne peux pas être donc calée en &xx00 pour le début pour utiliser des inc l par exemple.


Haut
 Profil  
 
Megachur
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 09:52 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 12 Juin 2008, 20:29
Message(s) : 1726
TOUKO a écrit :
Bah je connais pas l'asm z80 mais ..

Si ta table est de longueur fixe, tu initialise une variable de la longueur de ta table que tu décrémentes ..
A 0, tu es à la fin !! :)
Ou tu peux tester si l'adresse de ton pointeur, correspond à celle de la fin de ta table ..

Si elle est variable, je mettrai un mot particulier de fin de table ..


effectivement avec un caractère particulier en fin de table, ça pourrait un peu optimiser :

on gagne 1 nop sur le temps mini et une fois (tous les 256) on gagne 6 nop... par contre cela marche à condition que le mot de fin ne soit pas utilisé dans les datas...

Code :
table_adr_ptr equ $ +1
3   ld hl,table_adr
2   ld e,(hl)
2   inc hl
2   ld d,(hl)
2   inc hl
1   ld a,e
1   or d
3/2   jr nz,label_adr_nz
3   ld hl,table_adr
label_adr_nz
5   ld (table_adr_ptr),hl
---
21 mini /23 max

...
table_adr
   dw &1212
   dw &2121
...
   dw &0000
table_adr_end


est-ce quelqu'un à encore mieux ?


Haut
 Profil  
 
TOUKO
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 10:20 
Hors-ligne
Rulezz
Rulezz
Avatar de l’utilisateur

Inscription : 12 Juil 2010, 13:36
Message(s) : 169
Megachur a écrit :
effectivement avec un caractère particulier en fin de table, ça pourrait un peu optimiser :

on gagne 1 nop sur le temps mini et une fois (tous les 256) on gagne 6 nop... par contre cela marche à condition que le mot de fin ne soit pas utilisé dans les datas...


Oui bien sur, mais si tu utilises des words (et non des bytes), tu peux par exemple signer ton word de fin ..
Sinon reste à savoir ce que tu mets comme valeurs dans ta table .

Là elle apparaît fixe, pourquoi ne calcules tu pas son adresse de fin ???
Ou sur le premier word, tu ne met pas le nombre d'entrées qu'elle contient ?? ,tu le mettrais dans le registre BC :wink:


Haut
 Profil  
 
Longshot
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 11:25 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 28 Août 2008, 23:41
Message(s) : 270
Quitte à modifier ta routine pour tester la valeur et si tu n'as pas besoin de la pile (hors période interruption), tu peux remplacer
Code :
3   ld hl,table_adr
2   ld e,(hl)
2   inc hl
2   ld d,(hl)
2   inc hl

par
Code :
3   ld sp,table_adr
3   pop de


Après, dans l'esprit de ton ancienne routine (qui teste la valeur du pointeur avec adresse commune), on peut difficilement faire mieux
(6 nop sur 255 poids faibles, 11 nop 1 fois tous les 256 octets, 10 pour l'égalité.)


Haut
 Profil  
 
Megachur
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 11:32 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 12 Juin 2008, 20:29
Message(s) : 1726
TOUKO a écrit :
Megachur a écrit :
effectivement avec un caractère particulier en fin de table, ça pourrait un peu optimiser :

on gagne 1 nop sur le temps mini et une fois (tous les 256) on gagne 6 nop... par contre cela marche à condition que le mot de fin ne soit pas utilisé dans les datas...


Oui bien sur, mais si tu utilises des words (et non des bytes), tu peux par exemple signer ton word de fin ..
Sinon reste à savoir ce que tu mets comme valeurs dans ta table .

Là elle apparaît fixe, pourquoi ne calcules tu pas son adresse de fin ???
Ou sur le premier word, tu ne met pas le nombre d'entrées qu'elle contient ?? ,tu le mettrais dans le registre BC :wink:


en fait, c'est une liste de valeur qui me servent pour la suite...
si je stocke un compteur dans bc
il faut que je rajoute avant le code :

compteur_ptr equ $ +1
ld bc,compteur
dec bc
ld (compteur_ptr),bc

ce qui est plus couteux que de tester la fin de la table en fait...à moins qu'il y a une autre optimisation..

@ longshot : oui, j'aurai pu utiliser la pile si j'en ai pas besoin...par contre pour tester le dépassement de la fin de table, je dois utiliser quelque chose comme cela :
ld hl,0
add hl,sp
etc...
donc pas forcément moins couteux en temps z80 au final je pense.

merci encore de votre aide. je vais donc en rester pour l'instant sur cette version sauf si quelqu'un trouve encore une optimisation ;-) !


Haut
 Profil  
 
TOUKO
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 11:59 
Hors-ligne
Rulezz
Rulezz
Avatar de l’utilisateur

Inscription : 12 Juil 2010, 13:36
Message(s) : 169
Si le nombre d'éléments est < 256, un test sur un byte devrai te faire gagner des cycles .


Haut
 Profil  
 
shap
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 12:27 
Hors-ligne
VIP
VIP

Inscription : 26 Avr 2011, 15:27
Message(s) : 277
d'après ton exemple, il semble que ta table stock des données 16 bits non ?

si c'est le cas, utilises-tu les 8bits de poids fort ? si il te reste des valeurs que tu n'adresses pas, un flag sur le poids fort me semble le plus efficace, et tu n'as qu'un octet (ou un bit éventuellement) à tester.

Mais j'ai peut-être mal compris...


Haut
 Profil  
 
TOUKO
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 12:41 
Hors-ligne
Rulezz
Rulezz
Avatar de l’utilisateur

Inscription : 12 Juil 2010, 13:36
Message(s) : 169
C'est un peu ce que je lui suggérais, de signer le word de fin si possible .
Après faut voir quelles valeurs max il peu y avoir dans sa table.

Le coup du bit est pas mal, style le bit 15, serai très efficace aussi .


Haut
 Profil  
 
AsT
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 12:47 
Hors-ligne
VIP
VIP
Avatar de l’utilisateur

Inscription : 29 Août 2007, 08:04
Message(s) : 751
Localisation : Impact Hq
Megachur a écrit :

Code :
table_adr_ptr equ $ +1
3   ld hl,table_adr
2   ld e,(hl)
2   inc hl
2   ld d,(hl)
2   inc hl
1   ld a,l
2   cp table_adr_end
3/2   jr nz,label_adr_nz
1   ld a,h
2   cp table_adr_end/&100
3/2   jr nz,label_adr_nz
3   ld hl,table_adr
label_adr_nz
5   ld (table_adr_ptr),hl
---
22 mini /29 max

...
table_adr
   dw &1212
   dw &2121
...
table_adr_end






J'espère ne pas avoir fait d'erreur. J'ai fait ça rapidement, juste avant le taf.

Très bonne idée l'utilisatin de la pile.

Tu fais autant de pop que tu as d'adresses et la, pas besoin de bc.
Pour ma part, j'aurai fait un truc du style :

Code :
table_adr_ptr equ $ +1
3   ld hl,table_adr
     Ld bc,table_adr_end-table_adr
Boucle
2   ld e,(hl)
2   inc hl
2   ld d,(hl)
2   inc hl
     Dec bc
Ld a,b
Or c
Jr nz,Boucle
Ret

...
table_adr
   dw &1212
   dw &2121
...
table_adr_end

_________________
AsT / iMP4CT

Retrouvez nous sur le forum Amstrad Plus
"Call &bb06"


Haut
 Profil  
 
shap
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 12:49 
Hors-ligne
VIP
VIP

Inscription : 26 Avr 2011, 15:27
Message(s) : 277
TOUKO a écrit :
Le coup du bit est pas mal, style le bit 15, serai très efficace aussi .


Oui mais le problème du bit est que tu perds beaucoup de possibilité à écarter un bit de ta valeur.

dans ton exemple (bit 15) on passe de 2^16 possibilités à 2^15 ce qui revient à diviser par 2.

alors que si il réserve une seule valeur genre #ff, il ne perd qu'une seule possibilité de codage sur ses datas.

et l'avantage de le prendre sur le poids fort c'est, outre le fait de n'avoir qu'un octet à tester, que ça n'interdit en rien le #ff sur le poids faible.

Après tout dépend de ce qu'il veut coder dans sa table.


Haut
 Profil  
 
TOUKO
 Sujet du message : Re: test fin de table
Message Publié : 03 Juin 2011, 12:53 
Hors-ligne
Rulezz
Rulezz
Avatar de l’utilisateur

Inscription : 12 Juil 2010, 13:36
Message(s) : 169
Tout à fait ..
Effectivement, tu as raison pour la valeur, après si il peut se permettre de perdre le bit 15, faut voir si un test de bit sur le z80 est plus rapide qu'un test sur une valeur .


Dernière édition par TOUKO le 03 Juin 2011, 12:59, édité 1 fois.

Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  Page 1 sur 2
 [ 28 message(s) ]  Aller vers la page 1, 2  Suivant

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 13 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 :  
cron
Powered by phpBB® Forum Software © phpBB Group
Traduit en français par Maël Soucaze.