(Forth) BOIDS et la gestion des objets

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

__sam__
Messages : 3815
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 22 janv. 2017 18:30

Pour les optims en ASM on peut amméliorer. J'en donne quelques unes rapidement ici:

Code : Tout sélectionner

GETPOS.M
69E1 3410       PSHS   X                   7  NOTE: etonnement dans SETPOS on ne protège pas le contenu de X. Pourquoi? On put gagner 14 cycles en éliminant le PSHS/PULS X
69E3 AEC1       LDX    ,U++                8 ==> LDX ,U (5) 
69E5 EC81       LDD    ,X++                8 ==> LDD ,X (5)
69E7 3606       PSHU   B,A                 7 ==> STD ,U (5)
69E9 EC84       LDD    ,X                  5 ==> LDD 2,X (6) GAIN 7 cycles
69EB 3510       PULS   X                   7 
69ED 0EB4       JMP    /$B4                3
Ici on va éviter le [,u++] très couteux en déplacant l'incrément dans le LEAU qui suit

Code : Tout sélectionner

ADDPOS.M
69FC EC44       LDD    $04,U               6
69FE E3D4       ADDD   [,U]                9
6A00 EDD4       STD    [,U]                8
6A02 ECC4       LDD    ,U                  5
6A04 C30002     ADDD   #$0002              4
6A07 EDC4       STD    ,U                  5
6A09 EC42       LDD    $02,U               6
6A0B E3D4       ADDD   [,U]                9
6A0D EDD1       STD    [,U++]             11 ==> STD [,U] (8)
6A0F 3342       LEAU   $02,U               5 ==> LEAU 4,U (5) 
6A11 0EAC       JMP    /$AC                3 
On gagne 3 cycles, c'est déjà ca, mais en fait l'ensemble peut être ré-écrit en utilisant le registre X au lieu de [,U] faire gagner 4 cycles par instructions avec (,u] environ

Code : Tout sélectionner

(7) PSHS X   optionnel  si on a le droit d'écraser X
(5) LDX ,U
(6) LDD 4,U
(6) ADDD ,X
(5) STD ,X
(5) LDD 2,U
(7) ADDD 2,X
(6) STD 2,X
(7) PULS X optionnel 
(5) LEU 6,U
(3) JMP /$AC (TOTAL 62us)
On gagne alors 9cycles sur les 71 si on préserve le X, sinon si on peut écraser X, la routine descend à 48 cycles.

Plus loin, dans V/32 et V/8 au lieu de faire "LDD ,U++" en 8 cycles, un "PULU D" en 7 cycles est plus rentable.

Pour le calcule de ABS, on peut gagner en calculant "negd" autrement qu'avec des SUB (exemple COMA COMB ADDD#1, mais je préfère NEGA NEGB SBCA #0) et en écrivant le résulat que si on change effectivement la valeur:

Code : Tout sélectionner

(6) LDD 2,U
(3) BGE --------+
(2) NEGA        |
(2) NEGB        |
(2) SBCA #0     |
(6) STD 2,U     |
(6) LDD ,U <----+
(3) BGE --------+
(2) NEGA        |
(2) NEGB        |
(2) SBCA #0     |
(6) STD ,U      |
(3) JMP /$B0<---+
Enfin une optim générale: a<c and b<d peut s'optimiser en arithmétique complément à deux ainsi: ((a-c) BITAND (B-D))<0, cad en faisant le AND logique entre le bit de signe des deux soustraction. Ici on peut vachement s'éclater avec le 6809 (uh uh: :roll: )

Code : Tout sélectionner

(5) LDD ,U
(7) SUBD 4,U   ; D=a-c
(4) STA ,U     ; on a besoin que du bit 7 de D

(6) LDD 2,U
(7) SUBD 6,U   ; D=b-d

(4) ANDA ,U    ; bit 7 à 1 si a-c<0 et b-d<0

(2) CLRB       ; reg D=1 si reg A<0, 0 sinon.
(2) LSLA 
(2) ROLB
(2) SEX        ; oh!

(5) LEAU 6,U     ; mise à jour pile
(3) JMP /$B0     ; retour
Modifié en dernier par __sam__ le 22 janv. 2017 18:38, modifié 4 fois.
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Avatar du membre
yo_fr
Messages : 1301
Enregistré le : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par yo_fr » 22 janv. 2017 18:32

Pour simplifier les notions de dialectes de FORTH utilisé dans Hector voici ce que dit le manuel du FORTH d'Hector :

[img]Forth.JPG[/img]

C'est donc un Forth 79 - FIG et spécifique pour les E/S d'Hector :wink:
Fichiers joints
Forth.JPG
Forth.JPG (23.91 Kio) Vu 544 fois

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 22 janv. 2017 19:05

Merci bien _sam_ ! Je vais les tester en écrasant le X . Je ne sais pas pourquoi mais je l'avais préservé par crainte, cependant sans en être sur. En regardant la routine NEXT j'ai bien l'impression qu'on peut utiliser X et que c'est Y qu'il faut préserver.

Code : Tout sélectionner

                     PULL
 45AC 3342                    LEAU   $02,U              
 45AE 2006                    BRA    NEXT
                      PUT              
 45B0 EDC4                    STD    ,U                 
 45B2 2002                    BRA    NEXT
                      PUSH              
 45B4 3606                    PSHU   B,A                
                      NEXT    
 45B6 AEA1                    LDX    ,Y++               
 45B8 6E94                    JMP    [,X]
@ yo_fr ! ce serait donc un Forth spécifique au Hector à partir du FORTH PAMPUK. Je ne le connais pas, mais il semble bien documenté. C'est sympa de nous faire part de l'adaptation des Boids à ce Forth.

Hier j'avais fait des ASM pour la somme et la différence des vecteurs, pour les divisions par 8 et 2 des vecteurs, j'étais à 19 s par 10 cycles, mais ce matin ça marchait plus. :oops:

Je ne sais pas si Hector possède CREATE ... ;CODE pour remplacer <BUILDS .. DOES> . L'avantage est qu'on peut remplacer le code Forth après DOES> par du ASM. Je ne l'ai jamais utilisé, mais je vais tester. Tu connais ?

HELP : Je n'arrive pas à faire un programme spécifique en ASM de la division vecteur ( le TOS et le DOS de la pile) par 10 !

__sam__
Messages : 3815
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 22 janv. 2017 19:48

C'est vraiment pratique qu'on puisse écraser le registre X. Franchement le forth sur thomson m'aurait super plu à l'époque car il permet de faire un mix très bien fichu entre le langage de haut niveau et l'assembleur.

Donc tu veux faire une division par 10. Même en assembleur ca ne sera pas super-rapide. C'est pour faire quoi plus précisément? Car en multipliant toutes les constantes par 1.6, il suffit de remplacer la division par 10 par une division par 16 bien plus rapide. Tu veux une routine de division 16bit par 16 bits générale ou uniquement 16bits par 10 ?

Si c'est par 10 exclusivement, on peut remarqur qu'une valeur x/10 = (x + 9*(x/16 + x/256 + x/4096 + x/65536 + ... + x/16^k + ..))/16

Comme la précision n'est que de 16 bits, x/65535 vaut 0, on peut donc approximer x/10 par (x + 9*(x/16 + x/256 + x/4096)/16. Le "/16" peut facilement se faire avec des décalages (faire une version avec arrondi en ajouant 4 avant ou en utilisant la carry), quant à multiplication par 9, c'est multiplier par 8 (décalages) et ajouter la valeur d'origine. Allez je me lance (en supposant qu'on fait des primitives /16 et *8):

Code : Tout sélectionner

: /10 (x -- x/10)
 DUP /16 ( x x/16 )
 DUP /16  ( x x/16 x/256 )
 DUP /16 ( x x/16 x/256 x/4096 )
 + +  ( x x/16+x/256+x/4096 )
 DUP *8 + ( x 9*(x/16+x/256+x/4096) )
 + /16 ( (x + 9*(...))/16 )
;
Test avec 12345 /10

Code : Tout sélectionner

 DUP /16 ( 12345  772 )
 DUP /16  ( 12345  772 48 )
 DUP /16 ( 12345  772 48 3 )
 + +  ( 12345 823 )
 DUP *8 + ( 12345 7407 )
 + ( 19752 )
/16 ( 1234 ) 
ca a l'air de fonctionner! 8)
Modifié en dernier par __sam__ le 22 janv. 2017 20:21, modifié 2 fois.
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 22 janv. 2017 20:15

C'est pour caler une vitess qui est 10 % de la distance au centre de gravité.

Le centre de gravité de l'ensemble est X1 Y1 - les coordonnées du Boid sont X2 Y2 -> Vitesse V1 = (X1-X2)/10 (Y1-Y2)/10

Code : Tout sélectionner

I GETPOS.M     ; Prend position BOID externe
SUBV             ; distance au centre gravité
10 DIVV            ; 10 % = vitesse V1
Je peux essayer avec 1/8 ....

__sam__
Messages : 3815
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 22 janv. 2017 20:32

Si le vecteur vitesse n'utilise que 8 bits sur les 16 bits dispo tu peux aussi approximer /10 par excès avec (x*26)/256 = (x*16 + x*8 + x*2)/256

Code : Tout sélectionner

LSLB
ROLA
PSHU D     ; pile: 2x
LSLB
ROLA
LSLB
ROLA
PSHU D     ; pile: 2x 8x
LSLB
ROLA       ; pile 2x 8x, D=16x
ADDD ,U++  ; pile: 2x, D=16x+8x
ADDD ,U++  ; D=16x+8x+2x
TFR A,B    ; division par 256
SEX        ; extension de signe D=(16x+8x+2x)/256
Ca doit marcher tant que 26*x ne dépasse pas 32767, cad -1260<=x<=1260. On pouvait aussi approximer /10 par défaut avec (x*25)/256, ca revient à déplacer le 1er "PUSHU D" au tout début.
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 22 janv. 2017 21:04

La distance deltaX ou deltaY dépassera difficilement les 255 vu que c'est celle au centre de gravité de l’essaim; Même en promenant le LIDER tout à fait à l'extrémité. J'ai beaucoup de boulot à faire encore
A+

Obs : Je suis à 19 S les 10 cycles, et il manque encore tes optimisations :D

Avatar du membre
Papy.G
Modérateur
Messages : 1651
Enregistré le : 10 juin 2014 13:40
Localisation : Nantes/La Roche sur Yon

Re: (Forth) BOIDS et la gestion des objets

Message par Papy.G » 23 janv. 2017 12:13

Le Forth VG5000 n'est pas opérationnel pour cette expérimentation?
Dominique a écrit :Le Forth a la réputation d'être un langage déroutant et peu lisible.
C'est vrai.
Le Forth me semblant un langage intéressant, j'essaie de suivre, mais pour l'instant, je n'y comprends rien. :oops:
Je vais lire et relire à tête reposée les différents sujets, et, si je commence à comprendre, je reviendrais poser des questions. :mrgreen:
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 23 janv. 2017 15:42

@_sam_ J'ai bossé un peu entre midi et 2 sur tes optimisations :

GETPOS.M -> OK
ADDPOS.M -> OK pour ta 1° optimisation incrément dans le LEAU
............. -> registre X au lieu de [,U] dans la 2° fait planter avec ou sans PSHS X.

;ADDPOS.M

Code : Tout sélectionner

46BC AEC4                    LDX ,U
 46BE EC44                    LDD 4,U
 46C0 E384                    ADDD ,X
 46C2 ED84                    STD ,X
 46C4 EC42                    LDD 2,U
 46C6 E302                    ADDD 2,X
 46C8 ED02                    STD 2,X
 46CA 3346                    LEAU 6,U
 46CC 0EAC                    JMP     PULL 

PULU D dans V/8 V/32 et v/2 -> OK

ABSV -> ok

V<v -> Fait planter le programme.

Code : Tout sélectionner

471C ECC4                    LDD ,U
 471E A344                    SUBD 4,U
 4720 A7C4                    STA ,U
 4722 EC42                    LDD 2,U
 4724 A346                    SUBD 6,U
 4726 A4C4                    ANDA ,U
 4728 5F                      CLRB
 4729 48                      LSLA 
 472A 59                      ROLB
 472B 1D                      SEX
 472C 3346                    LEAU 6,U
 472E 0EB0                    JMP     PUT
Comme je n'avais pas trop de temps, peut être me suis trompé dans le listing ?


@Papy.G
Le Forth du VG (dont Joaopa a repris le moniteur) est compatible sauf que les PLOT et UNPLOT ne sont pas compatibles
et auraient besoin d'être reécrits en fonction de la machine.

C'est parfaitement faisable, mais il faut y bosser dur .

__sam__
Messages : 3815
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 23 janv. 2017 16:08

Je check... Arghhhh

Le décalage de 2 sur la pile U fait planter le prog. C'est de ma faute, j'avais mal compté:

Code : Tout sélectionner

ADDPOS.M:
46BC AEC4                    LDX ,U
46BE EC44                    LDD 4,U
46C0 E384                    ADDD ,X
46C2 ED84                    STD ,X
46C4 EC42                    LDD 2,U
46C6 E302                    ADDD 2,X
46C8 ED02                    STD 2,X
46CA 3346                    LEAU 6,U <=== Je pense qu'ici ce serait plutot LEAU 4,U (ma faute). 
46CC 0EAC                    JMP     PULL 
Ici par contre je ne vois pas ce qui peut faire un plantage de la pile, mais à comparer avec le code d'origine il semble que les soustractions sont dans l'autre sens: (6,u - 2,u) au lieu de (2,u - 6,u), aussi j'échangerais les arguments des LDD/SUBD comme suit:

Code : Tout sélectionner

V<v:
471C ECC4                    LDD ,U     ==> LDD 4,U
471E A344                    SUBD 4,U   ==> SUBD ,U 
4720 A7C4                    STA ,U 
4722 EC42                    LDD 2,U    ==> LDD 6,U  
4724 A346                    SUBD 6,U   ==> SUBD 2,U
4726 A4C4                    ANDA ,U 
4728 5F                      CLRB 
4729 48                      LSLA
472A 59                      ROLB
472B 1D                      SEX
472C 3346                    LEAU 6,U
472E 0EB0                    JMP     PUT
Si c'est bien ca qui fait planter, alors on peut encore gagner quelques cycles en sautant la 2eme soustraction si la 1ere est déjà positive ou nulle (et du coup on a pas besoin de stocker le bit 7 en ,U)

Code : Tout sélectionner

  LDD 4,U
  SUBD ,U
  BGE LABEL
  LDD 6,U
  SUBD 2,U
LABEL:
  LSLA    ; SORTIE DU B7
  LDD #0
  ROLB   ; Le bit7 de A (signe de la soustraction) passe en bit0 de B, cad D=0 ou 1.
  LEAU 6,U
  JMP PUT
Modifié en dernier par __sam__ le 23 janv. 2017 16:47, modifié 4 fois.
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 23 janv. 2017 16:40

Pour ADDPOS.M je viens de tester : Avec LEAU 4,U ça marche :D

Ne te prend pas trop la tête pour V<V je le teste avec le point d arrêt de l'émulateur des que j ai 2 minutes

EDIT :
Je viens de tester ta version

Code : Tout sélectionner

V<V 
4734 EC44                    LDD 4,U
 4736 A3C4                    SUBD ,U
 4738 2C04                    BGE LABEL
 473A EC46                    LDD 6,U
 473C A342                    SUBD 2,U
                      LABEL:
 473E 5F                      CLRB
 473F 48                      LSLA
 4740 59                      ROLB
 4741 1D                      SEX
 4742 3346                    LEAU 6,U
 4744 0EB0                    JMP PUT
Chapeau !! ça marche :D

La deuxième aussi a été testée et ça marche !! C'est celle à conserver ?

Code : Tout sélectionner

4746 EC44                    LDD 4,U
 4748 A3C4                    SUBD ,U
 474A 2C04                    BGE LABEL2
 474C EC46                    LDD 6,U
 474E A342                    SUBD 2,U
                      LABEL2:
 4750 48                      LSLA
 4751 CC0000                  LDD #0
 4754 59                      ROLB
 4755 3346                    LEAU 6,U
 4757 0EB0                    JMP PUT

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 23 janv. 2017 21:55

Voici un second rapport d’étape pour faire le point sur l'optimisation.

J'arrive à 15 s pour 10 cycles; On s'approche de l'objectif de 1 s par cycle.
Il est possible d'aller en dessous, mais ça ne sera déjà plus beaucoup du Forth.
Je reviendrai sur ce sujet.

Depuis le dernier point il y a eu :
a) les améliorations portées par _sam_ qui est un des maîtres en la matière de grappiller des cycles
ASM.
b) J'ai également mis en ASM la procédure ADDV (addition de 2 vecteurs) et SUBV (soustraction de 2 vecteurs)

Code : Tout sélectionner

 (a,b,c,d .. a-c,b-d)
SUBV
6AB2 EC46       LDD    $06,U               6
6AB4 A342       SUBD   $02,U               7
6AB6 ED46       STD    $06,U               6
6AB8 EC44       LDD    $04,U               6
6ABA A3C4       SUBD   ,U                  6
6ABC 3344       LEAU   $04,U               5
6ABE 0EB0       JMP    /$B0                3

(a,b,c,d .. a+c,b+d)
ADDV
6AC9 EC46       LDD    $06,U               6
6ACB E342       ADDD   $02,U               7
6ACD ED46       STD    $06,U               6
6ACF EC44       LDD    $04,U               6
6AD1 E3C4       ADDD   ,U                  6
6AD3 ED44       STD    $04,U               6
6AD5 3344       LEAU   $04,U               5
6AD7 0EB0       JMP    /$B0                3
c) J'ai fait une MACRO qui est la traduction en ASM de

SUBV ;Soustraction de 2 vecteurs (a,b,c,d..a-c,b-d)
DDUP ; (a,b .. a,b,a,b)
ABSV ; valeur absolue d'un vecteur (a,b ..|a|,|b|)
10 10 ; Vecteur 10 10 dans la pile
V<V ; Compare deux vecteurs. En fait : (|a|<10 AND |b|<10)

Cette MACRO n'est pas dans l'esprit Forth, et je m'en excuse.
Mais comme j'y vois tout intérêt à optimiser la boucle intérieure

34 1 DO ; Boucle extérieure - For each BOID
+++
..........34 1 DO ; Boucle intérieure - For each BOID
+++................: passe 33*(33-1)= 1056 fois par cycle
..........LOOP
+++
LOOP

je n'ai pas pu y résister.

Code : Tout sélectionner

Procédure MACRO

6AE4 EC46       LDD    $06,U               6
6AE6 A342       SUBD   $02,U               7
6AE8 ED46       STD    $06,U               6
6AEA ED42       STD    $02,U               6
6AEC EC44       LDD    $04,U               6
6AEE A3C4       SUBD   ,U                  6
6AF0 ED44       STD    $04,U               6
6AF2 EDC4       STD    ,U                  5
6AF4 EC42       LDD    $02,U               6
6AF6 2C06       BGE    $6AFE               3
6AF8 40         NEGA                       2
6AF9 50         NEGB                       2
6AFA 8200       SBCA   #$00                2
6AFC ED42       STD    $02,U               6
6AFE ECC4       LDD    ,U                  5
6B00 2C06       BGE    $6B08               3
6B02 40         NEGA                       2
6B03 50         NEGB                       2
6B04 8200       SBCA   #$00                2
6B06 EDC4       STD    ,U                  5
6B08 CC000A     LDD    #$000A              3
6B0B 3606       PSHU   B,A                 7
6B0D 3606       PSHU   B,A                 7
6B0F EC44       LDD    $04,U               6
6B11 A3C4       SUBD   ,U                  6
6B13 2C04       BGE    $6B19               3
6B15 EC46       LDD    $06,U               6
6B17 A342       SUBD   $02,U               7
6B19 48         ASLA                       2
6B1A CC0000     LDD    #$0000              3
6B1D 59         ROLB                       2
6B1E 3346       LEAU   $06,U               5
6B20 0EB0       JMP    /$B0                3

d) J'ai mis en ASM la partie de programme SWAP 1- 2 * + @ qu'on retrouve dans

Code : Tout sélectionner

CASE: <BUILDS SMUDGE ] DOES> SWAP 1- 2 * + @ EXECUTE ;

: TABLE.OBJ <BUILDS , etc.. DOES> SWAP 1- 2 * + @ ;

Code : Tout sélectionner

(index, adresse ... @(adresse+2*(index-1) )
SWAP 1- 2 * + @

6B2C EC42       LDD    $02,U               6
6B2E 5A         DECB                       2
6B2F 58         ASLB                       2
6B30 E3C4       ADDD   ,U                  6
6B32 ED42       STD    $02,U               6
6B34 ECD802     LDD    [$02,U]             9
6B37 3342       LEAU   $02,U               5
6B39 0EB0       JMP    /$B0                3
Il existe une possibilité très Forth de le faire en ASM.

: TABLE.OBJ CREATE , etc.. SMUDGE ;(CODE) <asm>

Mais je dois encore me familiariser avec CREATE ..SMUDGE ;(CODE)

Prochaines étapes : Optimiser les routine PLOT et UNPLOT - Court-circuiter certaines
procédures :
Je m'explique : Par exemple la procédure DDUP qui s'écrit OVER OVER. Alors autant éliminer DDUP et faire directement OVER OVER.
On gagne un appel de procédure.

On a encore de précieuses sec à grappiller
BoidsV3.zip
(2.15 Kio) Téléchargé 17 fois

__sam__
Messages : 3815
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 23 janv. 2017 22:11

Je suppose que l'index est plus petit que 128 ? Sinon il va y avoir un soucis dans le code ASM puisque tu ne fais le -1 que sur la partie basse de D. Je te suggèrerais l'optimisation suivante (à droite des "==>")

Code : Tout sélectionner

(index, adresse ... @(adresse+2*(index-1) )
SWAP 1- 2 * + @

6B2C EC42       LDD    $02,U               6 ==> (5) LDB 3,U (on a pas besoin de charger A. 1 cycle en moins)
6B2E 5A         DECB                       2 ==> (2) DECB
6B2F 58         ASLB                       2 ==> (2) ASLB
6B30 E3C4       ADDD   ,U                  6 ==> (7) PULU X (fort logiquement on récupère l'addresse dans le registre d'adresse)
6B32 ED42       STD    $02,U               6 ==> (3) ABX    (X<-X+B, non signé. Si l'index et plus petit que 63, alors on peut retirer ce ABX et faire LDD B,X directement ci-après ce qui fera encore gagner 2 cycles de plus)
6B34 ECD802     LDD    [$02,U]             9 ==> (5) LDD ,X (4 cycles en moins!)
6B37 3342       LEAU   $02,U               5 ==> (rien, le PULU X ci-dessus s'en charge: 5 cycles en moins)
6B39 0EB0       JMP    /$B0                3 ==> (3) jmp /$B0
Je m'explique : Par exemple la procédure DDUP qui s'écrit OVER OVER. Alors autant éliminer DDUP et faire directement OVER OVER.
On gagne un appel de procédure.
Existe-t-il la notion d'INLINE en FORTH qui fait que lorqu'on appelle un MOT dans une définition, ca n'est pas un appel du MOT qui est compilé, mais directement une recopie de la définition du mot en question. On perd en taille mémoire et en possibilité de redéfinir le mot, mais c'est sacrément plus rapide.

Sinon pour DDUP, en ASM je le ferais comme suit:

Code : Tout sélectionner

(5) LDX ,U
(7) PUSHU D
(7) PUSHU X
Modifié en dernier par __sam__ le 23 janv. 2017 22:31, modifié 4 fois.
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 23 janv. 2017 22:16

Non l'index (nombre de BOIDS en jeu) ne dépassera pas 128.
Cependant je vais prendre en compte ta remarque. Elle ne rajoute pas de cycles ASM ?
Sam a écrit...

Code : Tout sélectionner

...
6B2C EC42       LDD    $02,U               6 ==> (5) LDB 3,U (on a pas besoin de charger A. 1 cycle en moins)
...
Alors là, je tire mon chapeau ! Quelle vista.

__sam__
Messages : 3815
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 23 janv. 2017 22:34

Dominique a écrit :Non l'index (nombre de BOIDS en jeu) ne dépassera pas 128.
Cependant je vais prendre en compte ta remarque. Elle ne rajoute pas de cycles ASM ?
"B,X" utilise 1 cycle alors que ",X" 0 cycle. Donc dans l'absolu c'est plus lent. Mais on ne doit pas faire de ABX (3 cycles), donc au final on gagne 2 cycles.

Code : Tout sélectionner

(7) PULU X
(6) LDD B,X   (il faut que B<128, cad index<=62)

versus:
(7) PULU X
(3) ABX
(5) LDD ,X
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Répondre