Voici un premier rapport d'étape sur l'optimisation.
Je fais un calcul empirique qui me donnait avec la version V1 43 secondes pour 10 cycles d'affichage
et maintenant 23 à 24 s pour ces 10 cycles.
Ce n'est pas terminé, il faut travailler sur certaines routines LM et l'affichage des points
où on doit gagner encore quelques secondes.
Il ne faut pas se faire d'illusions, sauf à passer sur du 100 % LM on aura toujours un affichage
saccadé. Peut être moins de 10 s ??? on verra.
A) Première optimisation dans la procédures
RULES123. Comme l'avait justement indiqué
Mokona,
il faut maintenant passer par une table d'adresses des paramètres des
BOIDS.
Pour cela il faut réécrire la définition des
BOIDS qui perdront leurs
METHODEs.
Maintenant qu'on a l’algorithme de
RULES plus besoin de tâtonner.
Code : Tout sélectionner
: BOIDS.OBJ <BUILDS , , , , , , , , , , DOES> ;
l'appel de chaque
BOIDS nous donne l'adresse de ses paramètres qu'on va mettre dans un tableau
Attention à l'inversion de l'adressage, dû au fameux empilement/dépilement
Code : Tout sélectionner
: TABLE.OBJ <BUILDS , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , DOES> SWAP 1- 2 * + @ ;
permet de créer le tableau
BOID(N) .
<
Index> BOID(N) donne <adresseTableau + (index-1)*2> que nous lirons par @ pour obtenir l'adresse
paramètres du
BOID <Index>
Chaque
LOOP de
RULES123 travaillera sur un BOID (appelé externe) dont nous aurons l'adresse, soit dans une variable
MAIN.OBJ soit dans la pile
R.
Pour suivre le programme
RULES, s'informer au sujet des mots
>R R> et
I . Très attention car
DO LOOP se sert de la pile
R pour garder et tester les bornes.
B)
Ensuite l'optimisation s'occupe des routine FORTH pour les passer en LM.
Je ne suis pas un champion du LM du 6809, SVP n'hésitez pas à me communiquer toute modification de ces routines
pour le gain de temps.
Je donne leur définition en FORTH et ma traduction en LM
// (a , b , adr ... b-> adr+2 , a -> adr)
//: SETPOS.M DUP >R 2+ ! R> ! ;
Code : Tout sélectionner
CREATE SETPOS.M 3710 , 3706 , ED02 , 3706 , ED84 , 0EB6 , SMUDGE
69C8 3710 PULU X 7
69CA 3706 PULU A,B 7
69CC ED02 STD $02,X 6
69CE 3706 PULU A,B 7
69D0 ED84 STD ,X 5
69D2 0EB6 JMP /$B6 3
// (adresse .... a , b)
//: GETPOS.M DUP @ SWAP 2+ @ ;
Code : Tout sélectionner
CREATE GETPOS.M 3410 , AEC1 , EC81 , 3606 , EC84 , 3510 , 0EB4 , SMUDGE
69E1 3410 PSHS X 7
69E3 AEC1 LDX ,U++ 8
69E5 EC81 LDD ,X++ 8
69E7 3606 PSHU B,A 7
69E9 EC84 LDD ,X 5
69EB 3510 PULS X 7
69ED 0EB4 JMP /$B4 3
// (a , b , adr .... b ->+ adr+2 c->+ adr )
// somme b dans adresse+2, somme a dans adresse
//: ADDPOS.M DUP >R 2+ +! R> +! ;
Code : Tout sélectionner
CREATE ADDPOS.M EC44 , E3D4 , EDD4 , ECC4 , C300 , 02 C, EDC4 , EC42 , E3D4 , EDD1 , 3342 , 0EAC , SMUDGE
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
6A0F 3342 LEAU $02,U 5
6A11 0EAC JMP /$AC 3
//( a , b .... a/32 , b/32 )
Code : Tout sélectionner
CREATE V/32 EC42 , 8D08 , ED42 , ECC1 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 4756 , 4756 , 39 C, SMUDGE
6A32 EC42 LDD $02,U 6
6A34 8D08 BSR $6A3E 7
6A36 ED42 STD $02,U 6
6A38 ECC1 LDD ,U++ 8
6A3A 8D02 BSR $6A3E 7
6A3C 0EB4 JMP /$B4 3
6A3E 47 ASRA 2
6A3F 56 RORB 2
6A40 47 ASRA 2
6A41 56 RORB 2
6A42 47 ASRA 2
6A43 56 RORB 2
6A44 47 ASRA 2
6A45 56 RORB 2
6A46 47 ASRA 2
6A47 56 RORB 2
6A48 39 RTS 5
//( a , b .... a/8 , b/8 )
Code : Tout sélectionner
CREATE V/8 EC42 , 8D08 , ED42 , ECC1 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 39 C, SMUDGE
6A51 EC42 LDD $02,U 6
6A53 8D08 BSR $6A5D 7
6A55 ED42 STD $02,U 6
6A57 ECC1 LDD ,U++ 8
6A59 8D02 BSR $6A5D 7
6A5B 0EB4 JMP /$B4 3
6A5D 47 ASRA 2
6A5E 56 RORB 2
6A5F 47 ASRA 2
6A60 56 RORB 2
6A61 47 ASRA 2
6A62 56 RORB 2
6A63 39 RTS 5
//( a , b .... a/2 , b/2 )
Code : Tout sélectionner
CREATE V/2 EC42 , 4756 , ED42 , ECC1 , 4756 , 0EB4 , SMUDGE
6A6C EC42 LDD $02,U 6
6A6E 47 ASRA 2
6A6F 56 RORB 2
6A70 ED42 STD $02,U 6
6A72 ECC1 LDD ,U++ 8
6A74 47 ASRA 2
6A75 56 RORB 2
6A76 0EB4 JMP /$B4 3
// (a , b ... abs(a) , abs(b) )
: ABSV >R ABS R> ABS ;
Code : Tout sélectionner
CREATE ABSV EC42 , 2B03 , 7E C, HERE 9 + , CC C, 0 , A342 , ED42 , ECC4 , 2B C, 02 C, 0EB6 , CC C, 0 , A3C4 , 0EB0 , SMUDGE
6A81 EC42 LDD $02,U 6
6A83 2B03 BMI $6A88 3
6A85 7E6A8F JMP $6A8F 4
6A88 CC0000 LDD #$0000 3
6A8B A342 SUBD $02,U 7
6A8D ED42 STD $02,U 6
6A8F ECC4 LDD ,U 5
6A91 2B02 BMI $6A95 3
6A93 0EB6 JMP /$B6 3
6A95 CC0000 LDD #$0000 3
6A98 A3C4 SUBD ,U 6
6A9A 0EB0 JMP /$B0 3
// ( a , b , c , d .... Flag (a<c) and (b<d) )
// vrai si (a<c) and (b<d)
: V<V SWAP >R < SWAP R> < AND ;
Code : Tout sélectionner
CREATE V<V EC46 , A342 , 2B07 , 3346 , CC C, 0 , 0EB0 , EC44 , A3C4 , 2AF3 , 3346 , CC C, 1 , 0EB0 , SMUDGE
6AA4 EC46 LDD $06,U 6
6AA6 A342 SUBD $02,U 7
6AA8 2B07 BMI $6AB1 3
6AAA 3346 LEAU $06,U 5
6AAC CC0000 LDD #$0000 3
6AAF 0EB0 JMP /$B0 3
6AB1 EC44 LDD $04,U 6
6AB3 A3C4 SUBD ,U 6
6AB5 2AF3 BPL $6AAA 3
6AB7 3346 LEAU $06,U 5
6AB9 CC0001 LDD #$0001 3
6ABC 0EB0 JMP /$B0 3
Programme BOIDSV2
Code : Tout sélectionner
: TASK ;
HEX
CREATE SETPOS.M 3710 , 3706 , ED02 , 3706 , ED84 , 0EB6 , SMUDGE
CREATE GETPOS.M 3410 , AEC1 , EC81 , 3606 , EC84 , 3510 , 0EB4 , SMUDGE
CREATE ADDPOS.M EC44 , E3D4 , EDD4 , ECC4 , C300 , 02 C, EDC4 , EC42 , E3D4 , EDD1 , 3342 , 0EAC , SMUDGE
CREATE V/32 EC42 , 8D08 , ED42 , ECC1 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 4756 , 4756 , 39 C, SMUDGE
CREATE V/8 EC42 , 8D08 , ED42 , ECC1 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 39 C, SMUDGE
CREATE V/2 EC42 , 4756 , ED42 , ECC1 , 4756 , 0EB4 , SMUDGE
CREATE ABSV EC42 , 2B03 , 7E C, HERE 9 + , CC C, 0 , A342 , ED42 , ECC4 , 2B C, 02 C, 0EB6 , CC C, 0 , A3C4 , 0EB0 , SMUDGE
CREATE V<V EC46 , A342 , 2B07 , 3346 , CC C, 0 , 0EB0 , EC44 , A3C4 , 2AF3 , 3346 , CC C, 1 , 0EB0 , SMUDGE
: NIP SWAP DROP ;
65E8 CONSTANT RMULT
: 2VARIABLE <BUILDS SWAP , , DOES> ;
: 2@ DUP @ SWAP 2+ @ ;
: 2! DUP >R 2+ ! R> ! ;
3 1 2VARIABLE RLOC
: RNDM RLOC 2@ RMULT U* ROT 0 D+ OVER RLOC 2! ;
: RANDOM RNDM U* NIP ;
CREATE DI 1A50 , 0EB6 , SMUDGE CREATE EI 1CAF , 0EB6 , SMUDGE
7F CONSTANT C7F
BF CONSTANT CBF
DF CONSTANT CDF
EF CONSTANT CEF
F7 CONSTANT CF7
FB CONSTANT CFB
FD CONSTANT CFD
FE CONSTANT CFE
80 CONSTANT C80
40 CONSTANT C40
20 CONSTANT C20
10 CONSTANT C10
8 CONSTANT C08
4 CONSTANT C04
0 VARIABLE CURRENT.OBJ
0 VARIABLE COMPTV1
0 VARIABLE COMPTV2
0 VARIABLE COMPTV3
: FORME A7C0 DUP C@ 1 OR SWAP C! ;
CREATE /8 ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE
: CASE: <BUILDS SMUDGE ] DOES> SWAP 1- 2 * + @ EXECUTE ;
CASE: MASK-PLOT C80 C40 C20 C10 C08 C04 2 1 ;
CASE: MASK-UNPLOT C7F CBF CDF CEF CF7 CFB CFD CFE ;
: TROUVE-CELL 28 * OVER /8 + SWAP 7 AND ;
: (PLOT) 1+ MASK-PLOT OVER FORME C@ OR SWAP FORME C! ;
: (UNPLOT) 1+ MASK-UNPLOT OVER FORME C@ AND SWAP FORME C! ;
: UNPLOT.M TROUVE-CELL (UNPLOT) ;
: PLOT.M TROUVE-CELL (PLOT) ;
DECIMAL : ADDV SWAP >R + SWAP R> + SWAP ;
: SUBV SWAP >R - SWAP R> - SWAP ;
: DIVV DUP >R / SWAP R> / SWAP ;
: GETCUROBJ CURRENT.OBJ @ ;
: DDUP OVER OVER ;
: GETVELCTY.M 4 + GETPOS.M ;
: SETVELCTY.M 4 + SETPOS.M ;
: PLOT.C GETPOS.M PLOT.M ;
: UNPLOT.C GETPOS.M UNPLOT.M ;
: SETCUR.OBJ.M CURRENT.OBJ ! ;
: ADDVELCTY.M 4 + ADDPOS.M ;
: GETV1.M 8 + GETPOS.M ;
: SETV1.M 8 + SETPOS.M ;
: ADDV1.M 8 + ADDPOS.M ;
: SETV2.M 12 + SETPOS.M ;
: GETV2.M 12 + GETPOS.M ;
: ADDV2.M 12 + ADDPOS.M ;
: SETV3.M 16 + SETPOS.M ;
: GETV3.M 16 + GETPOS.M ;
: ADDV3.M 16 + ADDPOS.M ;
: MOVE.M DUP >R GETV1.M I GETV2.M ADDV I GETV3.M ADDV I ADDVELCTY.M I GETVELCTY.M R> ADDPOS.M ;
: BOIDS.OBJ <BUILDS , , , , , , , , , , DOES> ;
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD1
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD2
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD3
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD4
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD5
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD6
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD7
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD8
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD9
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD10
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD11
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD12
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD13
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD14
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD15
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD16
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD17
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD18
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD19
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD20
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD21
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD22
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD23
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD24
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD25
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD26
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD27
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD28
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD29
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD30
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD31
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD32
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD33
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD34
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD35
: TABLE.OBJ <BUILDS , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , DOES> SWAP 1- 2 * + @ ;
BD35 BD34 BD33 BD32 BD31 BD30 BD29 BD28 BD27 BD26 BD25 BD24 BD23 BD22 BD21 BD20 BD19 BD18 BD17 BD16 BD15 BD14 BD13 BD12 BD11 BD10 BD9 BD8 BD7 BD6 BD5 BD4 BD3 BD2 BD1 TABLE.OBJ BOID(N)
0 VARIABLE MAIN.OBJ
0 VARIABLE SECD.OBJ
: AFFI.BOID 34 1 DO I BOID(N) PLOT.C LOOP ;
0 0 2VARIABLE LIDER
: RULES123
34 1 DO ; Loop externe
I BOID(N)
DUP >R
MAIN.OBJ !
0 COMPTV2 !
0 0 DDUP DDUP DDUP ; 5 fois le vecteur 0 0
I SETVELCTY.M ; dans les champs de MAIN.OBJ
I SETV2.M
I SETV3.M
I SETV1.M
34 1 DO ; Loop Interne
I BOID(N) DUP >R ; BOID du loop interne dans pile R
MAIN.OBJ @ - ; Si adresses differents sont BOIDS differents
IF
I GETPOS.M ; Prend position BOID Interne
MAIN.OBJ @ ADDV1.M ; Somme V1 du BOID externe
MAIN.OBJ @ GETPOS.M ; Prend position BOID externe
I GETPOS.M ; Prend position BOID Interne
SUBV ; Distance des deux
DDUP ; duplique
ABSV ; ABS de distance
10 10 V<V IF ; Inférieure à 10 ?
MAIN.OBJ @ ADDV2.M ; si oui mise a jour V2 du BOID externe
I GETVELCTY.M ; prend vitesse BOID interne
MAIN.OBJ @ ADDV3.M ; Somme au V3 du BOID externe
1 COMPTV2 +! ; Compteur de BOIDS voisinage +1
ELSE ; sinon
DROP DROP ; jette Vecteur distance
ENDIF ENDIF
R> DROP ; rétablir intégrité pile R
LOOP
I GETV1.M ; Prend V1 du BOID externe
V/32 ; moyenne des 33 - 1 BOIDS (centre gravité)
LIDER 2@ ; Prend position LIDER
ADDV ; somme
V/2 ; / par 2 (nouveau centre)
I GETPOS.M ; Prend position BOID externe
SUBV ; distance au centre gravité
10 DIVV ; 10 % = vitesse V1
I SETV1.M ; Mettre dans champs V1 BOID externe
I GETV3.M ; Prend V3 Boid externe
COMPTV2 @ DUP IF ; Verifier si on a eu des voisins
DIVV ; Moyenne V3/Nbre Voisins
I GETVELCTY.M ; Lire Vitesse BOID Externe
SUBV ; Différence
V/8 ; prendre 1/8
I SETV3.M ; mettre dans V3
ELSE DROP DROP DROP ; Si non voisins vider pile
ENDIF
R> DROP ; Rétablir pile R
LOOP ;
: DRAW.BOIDS 34 1 DO I BOID(N) DUP >R UNPLOT.C I MOVE.M I PLOT.C R> DROP LOOP ;
: #IN 0 0 PAD DUP 3 EXPECT 1- (NUMBER) DROP DROP ;
: PARAM CLS LIDER 2@ ." VALEUR DU LEADER .... Y =" . CR ." X =" . CR ." NLLE VALEUR X (DE 0 A 319) " #IN CR ." NLLE VALEUR Y (DE 0 A 199) " #IN LIDER 2! CR ." Z POUR QUITTER" KEY 90 = IF EI LEAVE ENDIF CLS DRAW.BOIDS ;
: RULES DI CLS AFFI.BOID BEGIN RULES123 DRAW.BOIDS KEYF 14 = IF PARAM ENDIF AGAIN ;
: INIT 34 1 DO I BOID(N) MAIN.OBJ ! 320 RANDOM 200 RANDOM MAIN.OBJ @ SETPOS.M 0 0 MAIN.OBJ @ SETVELCTY.M 0 0 MAIN.OBJ @ SETV1.M 0 0 MAIN.OBJ @ SETV2.M 0 0 MAIN.OBJ @ SETV3.M LOOP ;
QUIT QUIT
N'hésitez pas à demander des précisions et à m'indiquer des améliorations afin de continuer
l'optimisation
Charger la K7 BoidsV2
Faire :
1 8 CLOAD BOIDSV2
Faire
1 LOAD
Lancer le programme
RULES
Touche Q - idem la V1
INIT remet à zero les BOIDS