Les dernières améliorations sur les routines ASM suggérées par _sam_ ont été faites et marchent.
J’ai rajouté TROUVE-CELL en ASM qui donne la cellule écran selon les coordonnées X Y du point par la formule Cellule = (28h * Y + X/8) et le reste de la division X/8 -> X AND 7
J’ai également rajouté la routine VERASE qui met à zéro les paramètres Vitesse ( Vlcty, V1 , V2, V3) du BOID objet du « loop externe »
Le gain n’a pas été fameux car on n’a gagné que ½ s pour 10 cycles.
Avant de poursuivre l’optimisation je vais m’attaquer à une grosse partie : Trouver les paramètres qui assurent une simulation crédible :
1 - La distance entre deux BOIDS pour qu’ils soient considérés voisins et s’éloignent l’un de l’autre ou calent leur vitesse l’un sur l’autre ;
Code : Tout sélectionner
: TASK ;
HEX
CREATE Z 0EB6 , SMUDGE
CREATE SETPOS.M 3710 , 3706 , ED02 , 3706 , ED84 , 0EB6 , SMUDGE
CREATE GETPOS.M AEC4 , EC84 , EDC4 , EC02 , 0EB4 , SMUDGE
CREATE ADDPOS.M AEC4 , EC44 , E384 , ED84 , EC42 , E302 , ED02 , 3344 , 0EAC , SMUDGE
CREATE /32 ECC1 , 4756 , 4756 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE
CREATE V/32 EC42 , 8D08 , ED42 , 3706 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 4756 , 4756 , 39 C, SMUDGE
CREATE V/8 EC42 , 8D08 , ED42 , 3706 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 39 C, SMUDGE
CREATE V/2 EC42 , 4756 , ED42 , 3706 , 4756 , 0EB4 , SMUDGE
CREATE ABSV EC42 , 2C06 , 4050 , 8200 , ED42 , ECC4 , 2C06 , 4050 , 8200 , EDC4 , 0EB0 , SMUDGE
CREATE V<V EC44 , A3C4 , 2C04 , EC46 , A342 , 48CC , 0 , 59 C, 3346 , 0EB0 , SMUDGE
CREATE SUBV EC46 , A342 , ED46 , EC44 , A3C4 , 3344 , 0EB0 , SMUDGE
CREATE ADDV EC46 , E342 , ED46 , EC44 , E3C4 , ED44 , 3344 , 0EB0 , SMUDGE
CREATE MACRO1 EC46 , A342 , ED46 , ED42 , EC44 , A3C4 , ED44 , EDC4 , EC42 , 2C06 , 4050 , 8200 , ED42 , ECC4 , 2C06 , 4050 , 8200 , EDC4 , CC C, A , 3606 , 3606 , EC44 , A3C4 , 2C04 , EC46 , A342 , 48CC , 0 , 59 C, 3346 , 0EB0 , SMUDGE
CREATE LMDOE E643 , 5A58 , 3710 , EC85 , 0EB0 , SMUDGE
CREATE TROUVE-CELL EC42 , 3606 , 4756 , 4756 , 4756 , ED44 , EC42 , 5849 , 5849 , 5849 , ED42 , 5849 , 5849 , E342 , E344 , ED44 , 3706 , 8600 , C407 , 0EB0 , SMUDGE
CREATE VERASE 3710 , 3004 , CC C, 0 , ED81 , ED81 , ED81 , ED81 , ED81 , ED81 , ED81 , ED81 , 0EB6 , 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 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> LMDOE ( 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 ;
: DDUP OVER OVER ;
( : V<V SWAP >R < SWAP R> < AND ; )
( : ABSV >R ABS R> ABS ; )
( : GETPOS.M DUP @ SWAP 2+ @ ; )
( : SETPOS.M DUP >R 2+ ! R> ! ;)
: GETVELCTY.M 4 + GETPOS.M ;
: SETVELCTY.M 4 + SETPOS.M ;
: PLOT.C GETPOS.M PLOT.M ;
: UNPLOT.C GETPOS.M UNPLOT.M ;
( : ADDPOS.M DUP >R 2+ +! R> +! ;)
: 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 ;
1 CONSTANT GETPOS
2 CONSTANT SETPOS
3 CONSTANT GETVELCTY
4 CONSTANT SETVELCTY
5 CONSTANT PLOT
6 CONSTANT UNPLOT
7 CONSTANT MOVE
8 CONSTANT SETCUR.OBJ
9 CONSTANT ADDPOS
10 CONSTANT ADDVELCTY
11 CONSTANT GETV1
12 CONSTANT SETV1
13 CONSTANT ADDV1
14 CONSTANT SETV2
15 CONSTANT GETV2
16 CONSTANT ADDV2
17 CONSTANT SETV3
18 CONSTANT GETV3
19 CONSTANT ADDV3
CASE: METHODE GETPOS.M SETPOS.M GETVELCTY.M SETVELCTY.M PLOT.C UNPLOT.C MOVE.M SETCUR.OBJ.M ADDPOS.M ADDVELCTY.M GETV1.M SETV1.M ADDV1.M SETV2.M GETV2.M ADDV2.M SETV3.M GETV3.M ADDV3.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> LMDOE ( 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)
( : TASK2 ; )
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 I BOID(N) DUP DUP >R MAIN.OBJ ! 0 COMPTV2 ! VERASE ( 0 0 DDUP DDUP DDUP I SETVELCTY.M I SETV2.M I SETV3.M I SETV1.M) 34 1 DO I BOID(N) DUP >R MAIN.OBJ @ - IF I GETPOS.M MAIN.OBJ @ ADDV1.M MAIN.OBJ @ GETPOS.M I GETPOS.M MACRO1 ( SUBV DDUP ABSV 10 10 V<V) IF MAIN.OBJ @ ADDV2.M I GETVELCTY.M MAIN.OBJ @ ADDV3.M 1 COMPTV2 +! ELSE DROP DROP ENDIF ENDIF R> DROP LOOP I GETV1.M V/32 LIDER 2@ ADDV V/2 I GETPOS.M SUBV 10 DIVV I SETV1.M I GETV3.M COMPTV2 @ DUP IF DIVV I GETVELCTY.M SUBV V/8 I SETV3.M ELSE DROP DROP DROP ENDIF R> DROP LOOP ;
: DRAW.BOIDS 34 1 DO I BOID(N) DUP >R ( MAIN.OBJ ! MAIN.OBJ @) UNPLOT.C I ( MAIN.OBJ @) MOVE.M I ( MAIN.OBJ @) 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