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

test fin de table
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=4541
Page 1 sur 2

Auteur :  Megachur [ 03 Juin 2011, 07:46 ]
Sujet du message :  test fin de table

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:

Auteur :  TOUKO [ 03 Juin 2011, 09:07 ]
Sujet du message :  Re: test fin de table

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 ..

Auteur :  Demoniak [ 03 Juin 2011, 09:11 ]
Sujet du message :  Re: test fin de table

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

Auteur :  TOUKO [ 03 Juin 2011, 09:33 ]
Sujet du message :  Re: test fin de table

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 ???

Auteur :  Megachur [ 03 Juin 2011, 09:42 ]
Sujet du message :  Re: test fin de table

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.

Auteur :  Megachur [ 03 Juin 2011, 09:52 ]
Sujet du message :  Re: test fin de table

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 ?

Auteur :  TOUKO [ 03 Juin 2011, 10:20 ]
Sujet du message :  Re: test fin de table

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:

Auteur :  Longshot [ 03 Juin 2011, 11:25 ]
Sujet du message :  Re: test fin de table

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é.)

Auteur :  Megachur [ 03 Juin 2011, 11:32 ]
Sujet du message :  Re: test fin de table

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 ;-) !

Auteur :  TOUKO [ 03 Juin 2011, 11:59 ]
Sujet du message :  Re: test fin de table

Si le nombre d'éléments est < 256, un test sur un byte devrai te faire gagner des cycles .

Auteur :  shap [ 03 Juin 2011, 12:27 ]
Sujet du message :  Re: test fin de table

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...

Auteur :  TOUKO [ 03 Juin 2011, 12:41 ]
Sujet du message :  Re: test fin de table

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 .

Auteur :  AsT [ 03 Juin 2011, 12:47 ]
Sujet du message :  Re: test fin de table

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

Auteur :  shap [ 03 Juin 2011, 12:49 ]
Sujet du message :  Re: test fin de table

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.

Auteur :  TOUKO [ 03 Juin 2011, 12:53 ]
Sujet du message :  Re: test fin de table

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 .

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