Jump to content
Jagware
Sign in to follow this  
RaZ

L'optimisation Du Code 68000

Recommended Posts

RaZ    0

Article en construction

 

Dans cette partie vous trouverez différentes techniques ou astuce pour le code 68000, pour ceux qui ont du mal a utiliser le Gpu / Dsp ou les ont déjà chargés a mort !!

 

Ces techniques proviennent d'un paquet d'années passés sur le St en developement de démo, ceci proviendront aussi bien de recherches persos que de trucs ultra connu dans la communauté 68000.

 

C'est parti !!

 

Quelques bases utiles :

 

D'un point de vue binaire, une multiplication par 2 d'une valeur consiste a décaler cette valeur vers la gauche de un :

 

lsl.w #1,d0

 

multiplie d0 par 2, le lsl.w fait 8+2n cycles, n étant le nombre de décalages.

 

Et tout les multiples des puissances de deux sont possibles, par exemple multiplier par 4,8,16,32,64,128, etc... toute ces multiplications sont transformables en décalage. Exemple multiplication par 32 de d4 :

 

lsl.w #5,d4 (2^5=32)

 

Ce qui est beaucoup plus rapide. Il y a encore plus rapide pour la multiplication par 2 c'est

 

add.w d0,d0

 

Qui fait pareil et est encore plus rapide !!

 

si vous devez faire des multiplications, essayez de voir si vous pouvez pas la réduire en différents décalages, exemple une multiplication par 160 peut ètre décomposé en deux multiplications, une de 128 et une 32 (128+32=160)

 

move.w d0,d1

lsl.w #8,d0

lsl.w #5,d1

 

add.w d1,d0

 

et voila votre multiplication faite a coup de décalages et c'est beaucoup plus rapide !!

 

Division par les multiples de puissance de 2 c'est exactement pareil mais decalage a droite :

 

lsr.w #x,d0 (X etant bien sur le nombre de decalages !)

 

.....

 

 

Et maintenant 2 techniques bien puissantes :

Code automodifiant

Code automodifiant ? C'est quoi ce truc ?

 

C'est simple c'est un code qui peut modifier un ou plusieurs instructions durant son déroulement, on dirait un truc de science fiction et bien non.

 

Cela n'est possible qu'en assembleur, car vous savez exactement ou se trouvent les instructions et comment elles sont codées.

 

L'adresse d'une instruction est simple a obtenir :

 

Adresse_instruction:

nop

 

Je sais un nop c'est pas le truc du futur mais c'est pour comprendre. Imaginons que maintenant vous voulez transformez cette instruction en addition par exemple add.w d0,d1, comment qu'on va faire ? Prenez votre assembleur, tapez votre instruction : add.w d0,d1 affichez l'assemblage a l'‚cran, vous allez obtenir le code hexa de l'instruction qui est : $d240, marrant hein ?! Sinon vous pouvez prendre une doc 68000 et assemblez l'instruction a la main, mais c'est pas très marrant, après un moment a pratiquer cela, certaines instructions

on connait par coeur leur valeur hexa !!

 

Maintenant baguette magique hop un nop en addition, c'est simple on fait :

 

move.w #$d240,Adresse_instruction

 

c'était dur n'est ce pas !!!! A quoi cela peut servir ? A mettre un peu de patate dans votre code, imaginons que vous voulez remplir une zone mémoire avec 4 mots différents suivant une couleur, avant vous faisiez comme cela :

 

Boucle :

si couleur=1

écrire un mot x

sinon écrire un mot y

end si

 

si couleur=2

écrire un mot x

sinon écrire un mot y

end si

(Encore 2 fois)

..............

boucler jusqu'a truc

 

On peut faire cela de façon beaucoup plus rapide, vous testez votre valeur en dehors et vous modifiez vos instructions dans la boucle suivant la couleur, votre boucle devient alors cela :

 

Boucle :

écrire mot a

écrire mot b

écrire mot c

écrire mot d

boucler jusqu'a truc

 

C'est plus court et beaucoup plus rapide, certains vont dire ont peu utiliser 4 registres et mettre les bonnes valeurs en dehors de la boucle, d'abord faudrait déjà avoir 4 registre de libre et ensuite ceci n'est qu'un exemple, a vous de choisir quand faudra l'utiliser.

 

Faites gaffe au taille des instructions quand meme, remplacez une de 2 par une de 4 peut poser quelque soucis....

 

Code généré

 

Ca c'est une technique de bourrin, un truc a ne pas oublier, un truc de mangeur de ram.

 

Vous faites du 68000 depuis 1784 (Hein !), vous connaissez les dbra dans tous les sens et les utilisez a toutes les sauces, mais vous savez aussi que pour manger des cycles ca va etre dur de le battre (exception faite de truc ultra lent) !!! 12 Cycles la bete, ca fait mal la boucle, prenons un exemple, une boucle de 200 un truc assez courant 200*12=2400 cycles, ces cyles il y a moyen de les récuperer.

On va écrire un morceau de code qui va 'générer‚' 200 fois le bout de code a repeter mais sans le dbra, on va gagner 2400 cycles et un registre, mais la contrepartie cela mange un peu de ram mais pas de quoi tuer un chat. Il existe plusieurs techniques pour generer 200 fois un code, certains vont utiliser les directives de compilation :

 

REPT 200

add.w d0,d1

lsl.w #8,d7

ENDR

 

Cela est pas terrible, et peut être lent suivant la machine utilisée pour assembler ou suivant l'assembleur. Perso je fais comme cela :

 

Vous écrivez votre bout de code quelque part ou il dérange pas :

 

Debut_code:

nop

add.w d0,d0

lea 160(a0),a0

Fin_code:

 

Vous allez en section bss et envoyez ceci :

 

Code_genere: ds.b 200*(Fin_code-Debut_code)

ds.b 2

 

Voila vous avez reserve la place necessaire a votre code+2 octets qui vont servir a...

 

Ensuite dans les inits on envoie cela :

 

lea Code_genere,a0

move.w #200-1,d7

Copy_gen_code:

lea Debut_code,a1

move.w #(Fin_code-Debut_code-1),d6

lsr.w #1,d6 ; on divise par 2, les instructions

; sont obligatoirement paire

subq.w #1,d6 ; -1 pour le dbra

Copy_le_bout_de_code:

move.w (a1)+,(a0)+

dbra d6,Copy_le_bout_de_code

 

dbra d7,Copy_gen_code

 

Et voila vous venez de générer 200 fois votre code, il manque un truc, aprês ceci faut rajouter un :

 

move.w #$4e75,(a0)

 

C'est quoi cela ? Un 'Rts' est rajouté a la fin du code généré, donc maintenant quand vous voulez utiliser votre code généré :

 

jsr Code_genere

 

La classe, le programme est plus leger (a la lecture), plus rapide.

Cette technique est une technique de bourrin, c'est sur mais quand on a pas de cycle de libre on 'ram' oui je sais je sors.......

 

Une technique combinatoire est possible, générer du code mais d'aprês certains critêres, cela permet d'avoir du code ultra spécifique sans dbra.

 

Pour ceux qui connaissent, par exemple le Flexiscroll de Griff (Electronic Images) dans la Decade démo, a utiliser ces deux techniques pour générer pour chaque lettre un code spécifique.

 

Ces techniques m'ont permis de faire des effets qui n'aurait pas été possible a cette vitesse la, ces techniques ne sont plus utilisées actuellement car maintenant pour accelerer un code, on accelere sa carte mêre, et surtout a savoir, un (micro) processeur avec un cache n'apprécies pas toujours le code auto modifiant, car dans certains cas il va modifier les données dans le cache et pas dans la ram ce qui peut faire planter la chose voire des résultats aléatoires !!!! Par contre ce sont des techniques qui peuvent servir pour tout ceux qui font du retro-gaming, toutes les consoles passé‚s sans cache, c'est utilisable.

 

Dans le cas de la Jag vous pouvez y aller comme vous voulez ca craint rien !!! Mais n'utilisez le 68000 quand dernier recours, quand le Gpu et le Dsp sont bloqués et peuvent plus rien faire, les deux processeurs sont três três rapides, et vous avez peut être pas besoin de ce genre de code (Quoi que je ferais bien du code automodifiant dessus) mais faites gaffe, les procs n'ont pas de cache mais decode les instructions 'beaucoup en avance', au moment ou vous changez l'instruction il aura peut être déjà décodé l'instruction et votre modification ne prendra lieu qu'au prochain passage, donc a utiliser quand vous savez ce qu vous faites.

 

En ésperant que vous ayez appris quelque chose avec ceci, pour l'instant retournez donc faire du code, ca fera avancez tout le monde !!!

 

GT Turbo

Share this post


Link to post
Share on other sites
SebRmv    2
ça date de début 2006 ou j'ai raté un truc ?

 

ouais, pareil, je me pose des questions...

Share this post


Link to post
Share on other sites
Tursi    0

Hehe.. I didn't notice the 2006 date either. ;) Templeton's post was the first new one I have seen since Oct 10th!!

 

My system won't cache the cookies for this board correctly - I can't stay logged in and it doesn't correctly show the new posts. :/

Share this post


Link to post
Share on other sites
Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×