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