(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

Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par yo_fr »

Je m'excuse de revenir un peu en arrière mais j'essaye (avec peu de temps dispo) de porter ton code sur Hector.

lorsque je compile

Code : Tout sélectionner

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

CASE: MASK-PLOT C80 C40 C20 C10 C08 C04 2 1 ; 
il m'indique un CASE: inconnu sur la seconde ligne.

D'autre part sur les mots asm tu pourrais aussi donner le but du code pour transcoder en Z80 -mon processeur :wink:
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique »

A) Pour ce qui est du CASE: 1 et 2 sont des constantes dans le Forth du MO5.
Leur définition est :

Code : Tout sélectionner

1 CONSTANT 1
2 CONSTANT 2

Si 2 ou 1 ne sont pas des CONSTANT sur le Forth du Hector, tu les nommes

Code : Tout sélectionner

2 CONSTANT C2
1 CONSTANT C1
.....
CASE: MASK-PLOT C80 C40 C20 C10 C08 C04 C2 C1 ; 
Obs : c'est à mon avis la raison la plus probable. Si 1 ou 2 ne sont pas des constantes, Forth va chercher à les compiler

Code : Tout sélectionner

... LIT 01 ...  LIT 02 ..

au lieu de donner une adresse d'exécution.


B) Si j'ai bien compris, comme tu veux traduire les mots Langage Machine du 6809, tu demandes des précisions sur leur définition.

Je vais le faire demain sans faute.

C) Question subsidiaire : L'écran et l'adressage écran étant différents sur Hector, as tu trouvé un moyen de faire un PLOT et UNPLOT sur l'écran - Peut être y a-t-il déjà ces instructions ?
A+
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par yo_fr »

Alors sur Hector les constantes 1 et 2 (ainsi que 0) sont déjà définies. D'ailleurs, les 2@ et 2! 2VARIABLE aussi!
Il faudrait que je me replonge dans mes bouquins de Forth, mais il me semblait qu'un <BUILDS devait se terminer avec un >
(je dis ça vraiment de mémoire, à confirmer donc). Je vais creuser ça (moi aussi faut du temps).

C) en fait sur Hector la gestion d'écran n'est pas un problème pour moi (passage en page vidéo, puis adressage de la mémoire en C000 et F900, par paquet de 2 bits / pixel) puis repassage en page programme. rien d'extraordinaire.


B) Dans ton Forth, pour quitter un mot tu utilise quelle instruction ? dans les Forth Z80 c'est un JP (IX) qui est généralement utilisé. IX étant un registre d'indexation et il contient l'adresse de retour des mots.

En tous cas tu manies très bien le Forth ! Chapeau !
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Mokona »

1 CONSTANT 1 et 2 CONSTANT 2 ?

À quoi cela sert-il d'avoir ces exceptions dans les chiffres ?
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par yo_fr »

à aller plus vite !
Les chiffres 0 à 2 sont très souvent utilisés dans les codes 0, 1 et 2 ont été définis en tant que MOT pour être plus rapidement trouvé dans le dictionnaire et être exécuté également plus vite !
Sinon, aucun intérêt !
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Mokona »

Est-ce que cela signifie que la recherche des mots se fait en priorité sur le parsing d'une valeur numérique ?
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique »

yo_fr a écrit :... il me semblait qu'un <BUILDS devait se terminer avec un >
(je dis ça vraiment de mémoire, à confirmer donc). Je vais creuser ça (moi aussi faut du temps).
Tous les <BUILDS du programme se terminent par des DOES> dans mon programme.
Je ne vois pas d'où pourrait venir ton problème dans CASE: si ce n'est un manque de définition des mots C80 C40 C20 C10 C08 C04 2 ou 1
yo_fr a écrit :C) en fait sur Hector la gestion d'écran n'est pas un problème pour moi (passage en page vidéo, puis adressage de la mémoire en C000 et F900, par paquet de 2 bits / pixel) puis repassage en page programme. rien d'extraordinaire.
Parfait. Comme tu le sais sur MO5 le pixel X=0 Y=0 est en haut à gauche et le pixel X=319 Y = 199 est en bas à droite.

Il me semble que sur Hector les Y sont croissant en remontant.

yo_fr a écrit :B) Dans ton Forth, pour quitter un mot tu utilise quelle instruction ? dans les Forth Z80 c'est un JP (IX) qui est généralement utilisé. IX étant un registre d'indexation et il contient l'adresse de retour des mots.
Je ne suis pas très doué pour le LM du 6809

Mais pour quitter le Forth on a 4 possibilités :

A) Un Jump NEXT assimilé à un C3 B6 45 " ou JP (IX) dans le cas du Forth Hector"
Comme le 6809 permet de définir la page 45 par SETDP $45 on peut omettre 45 et l'instruction se codifie 0EB6
B) Un jump PUSH assimilé à un C3 B4 45 mais qui aura fait un PUSH d'un registre avant le NEXT - se codifie 0EB4
C) un jump PULL assimilé à un C3 AC 45 mais qui aura fait un POP d'un registre avant le NEXT - se codifie 0EAC
D) un jump PUT assimilé à un C3 B0 45 mais qui aura fait un POP d'un registre puis un PUSH de son registre principal (D) avant le NEXT - se codifie 0EB0

Merci pour ton commentaire, c'est sympa et réciproque
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique »

@Mokona

- Durant la phase de compilation Forth cherche effectivement tout d'abord si le mot se trouve dans son dictionnaire, s'il ne le trouve pas il regarde s'il ne s'agit pas d'une valeur numérique.

- Mais je pense que la rapidité dont parlait yo_fr se situe surtout au niveau de l'exécution. Si Forth rencontre 1 il le trouve dans son dictionnaire puisque c'est une constante. Il va le codifier sous la forme de son adresse "Exécution".
Si 1 n'a pas été défini comme constante Forth va codifier 1 par LIT 01
LIT est un programme LM qui lui dit de lire la ligne suivante, où il trouve 01 et de mettre 01 dans la pile. C'est beaucoup plus long que d'exécuter la constante en plus d'occuper 2 octets supplémentaires.

Obs : ne pas prendre le mot "Exécution" de l'adresse dans le sens JSR adresse
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Mokona »

Merci pour les précisions. Ca fait sens.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique »

@yo_fr

Le mot DI est un disable interrupts, nécessaire pour éliminer le curseur clignotant DU MO5

Code : Tout sélectionner

CREATE DI 1A50 , 0EB6 , SMUDGE

	1A50                    ORCC   #$50               
	0EB6                    JMP    NEXT     
Le mot EI est un enable interrupts

Code : Tout sélectionner

CREATE EI 1CAF , 0EB6 , SMUDGE 

	1CAF                    ANDCC  #$AF               
	0EB6                    JMP    NEXT               
Le mot FORME est particulier au MO5 et permet d'acceder à l'écran FORME lors du PLOT. Tu ne dois pas en avoir besoin

Code : Tout sélectionner

: FORME A7C0 DUP C@ 1 OR SWAP C! ;
Le mot /8 est une division par 8 avec reste.

Code : Tout sélectionner

	ECC1                    LDD    ,U++               
	47                      ASRA                      
	56                      RORB                      
	47                      ASRA                      
	56                      RORB                      
	47                      ASRA                      
	56                      RORB                      
	0EB4                    JMP    PUSH              

CREATE /8 ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE  
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique »

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
BoidsV2.zip
(2.11 Kio) Téléchargé 102 fois
Faire : 1 8 CLOAD BOIDSV2
Faire 1 LOAD

Lancer le programme RULES

Touche Q - idem la V1
INIT remet à zero les BOIDS
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par yo_fr »

Je m'excuse de revenir un peu en arrière (bis)

Pour que cela fonctionne sur Hector je suis obligé de modifier le code suivant :

Code : Tout sélectionner

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

CASE: MASK-PLOT C80 C40 C20 C10 C08 C04 2 1 ; 
et cela me semble normal : lorsque le SMUDGE est saisi, comme il est IMMEDIAT et donc il "smudge" le dernier mot du disco soit CASE: et non en tant que BUILDS> lors de la prochaine utilisation de CASE: !

Par contre je ne m'explique pas pourquoi cela fonctionne sur les autres FORTH sans SMUDGE ! (y compris dans l'article source...

peux tu essayer ma syntaxe sur ton FORTH ? je suis curieux du résultat...
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique »

Ne t'excuse pas, bien au contraire.
Je suis ravi de voir que tu fais tourner le Forth du Hector.

Tu as trouvé la raison - Pour le Forth du MO5 SMUDGE n'est pas IMMEDIAT.
Le bit 7 de 86 est 0
Donc toi tu dois le compiler - correct

Code : Tout sélectionner

; FORTH MO5
                      ;****************
                      ;* LE MOT SMUDGE
                      ;****************
                      w_smudge
 54D1 86                      FCB $86 
 54D2 534D554447              FCC "SMUDG"
 54D7 C5                      FCB $80+'E
 54D8 54BF                    FDB w_semi
                      cf_smudge
 54DA 4D70                    FDB c_docol 
 54DC 5136                    FDB cf_latest 
 54DE 4E10                    FDB cf_bl 
 54E0 54ED                    FDB cf_toggle 
 54E2 4C62                    FDB cf_semis 
Pour l'article source, il me semble que l'on ne SMUDGE qu'avec la version FIG-FORTH , pas la V 79. (A confirmer)
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique »

Ta définition marche à l'identique. [COMPILE] . Il ne doit pas vérifier si le mot suivant à compiler est immédiat ou non.
Hector.jpg
Hector.jpg (6.13 Kio) Consulté 4086 fois
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par yo_fr »

Parfait ! on est donc d'accord !

Effectivement il y a des différences dans l'article mais en FORTH 79 il ne met pas le SMUDGE alors qu'en FIG ( et MMSFORTH, que je ne connais pas) : oui :wink:
Par contre à aucun moment il ne mettent le [COMPILE]...
Répondre