(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 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 » 28 févr. 2017 13:44

__sam__ a écrit : Comme toujours pour aller vite il faut éviter de faire 2 fois (presque) la même chose.
Comme quoi des règles aussi simples peuvent parfois nous échapper : Je viens de voir que je calculais 2 fois l'adresse écran à partir de la position du BOID : Une fois pour l'afficher, une fois pour l’effacer; ... corrigé !

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 » 01 mars 2017 14:07

Bonjour tous,

Comme je ne vais pas encore mettre la partie ASM du programme - elle n'est pas encore terminée et mérite bien une révision - je vais vous mettre la vidéo de la performance actuelle.

Merci _sam_ PS : Je suis un peu jaloux de ceux qui arrivent à nous mettre l'image Youtube dans leur message. Je dois faire des fausses manœuvres car la balise youtube me donne "erreur ID : " au lancement.

Comme dans cette vidéo je montre la façon tellement facile d'intégrer le listing Forth, j'ai pensé mettre en fichier joint les
*.bin actuels.

Le mouvement des Boids est maintenant assez rapide, mais comme je l'avais dit je ne m'attaquerais au problème du mouvement saccadé que plus tard.



BOIDS.zip
(2.54 Kio) Téléchargé 16 fois
A plus.
Modifié en dernier par Dominique le 01 mars 2017 19:08, modifié 4 fois.

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

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 01 mars 2017 18:33

Dominique a écrit :PS : Je suis un peu jaloux de ceux qui arrivent à nous mettre l'image Youtube dans leur message. Je dois faire des fausses manœuvres car la balise youtube me donne "erreur ID : " au lancement.
Tu veux dire comme ceci:

Il faut mettre le code final de la vidéo sans http ni deux-points ou slash entre les balises youtube. Fait un "Citer" pour voir le code que j'ai utilisé :)

Même sans ASM revisité, c'est déjà pas mal rapide. Bravo!
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 » 01 mars 2017 19:16

Merci encore une fois.

Sur la vidéo j'avais mis en ASM la partie affichage (PLOT et UNPLOT), les opérations sur les vecteurs, les opérations SET et GET sur les BOIDS, quelques /8 /16.
Il me reste à travailler sur les calculs de dépassement écran, les touches clavier et les LOOP.
Dans cette première partie je vais laisser Random en Forth et d'autres petites procédures

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 » 01 mars 2017 21:23

J'avais pensé ne pas mettre de ASM avant d'être plus avancé, mais je bute sur la division par 16 d'une valeur
qui peut être négative.
Le Forth lui même (enfin les auteurs du compilateur) mettent également un Flag (ici à $65BB ) pour marquer les valeurs négatives.

Comme je dois faire une procédure V/2 , j'ai l'impression que la logique de mon code est un peu longuette.

Code : Tout sélectionner

( a , b , .... a/16 , b/16 ) 
CREATE V/16 8601 , B7 C, HERE 41 + , EC42 , 2A08 , CC C, 0 , A342 , 70 C, HERE 35 + , 8D32 , ED42 , B6 C, HERE 2E + , 2A07 , CC C, 0 , A342 , ED42 , 8601 , B7 C, HERE 20 + , ECC4 , 2A08 , CC C, 0 , A3C4 , 70 C, HERE 14 + , 8D11 , EDC4 , B6 C, HERE D + , 2A07 , CC C, 0 , A3C4 , EDC4 , 0EB6 , 0 C, 4756 , 4756 , 4756 , 4756 , 39 C, SMUDGE 

6577 8601       LDA    #$01                2
6579 B765BB     STA    $65BB               5
657C EC42       LDD    $02,U               6
657E 2A08       BPL    $6588               3
6580 CC0000     LDD    #$0000              3
6583 A342       SUBD   $02,U               7
6585 7065BB     NEG    $65BB               7
6588 8D32       BSR    $65BC               7
658A ED42       STD    $02,U               6
658C B665BB     LDA    $65BB               5
658F 2A07       BPL    $6598               3
6591 CC0000     LDD    #$0000              3
6594 A342       SUBD   $02,U               7
6596 ED42       STD    $02,U               6
6598 8601       LDA    #$01                2
659A B765BB     STA    $65BB               5
659D ECC4       LDD    ,U                  5
659F 2A08       BPL    $65A9               3
65A1 CC0000     LDD    #$0000              3
65A4 A3C4       SUBD   ,U                  6
65A6 7065BB     NEG    $65BB               7
65A9 8D11       BSR    $65BC               7
65AB EDC4       STD    ,U                  5
65AD B665BB     LDA    $65BB               5
65B0 2A07       BPL    $65B9               3
65B2 CC0000     LDD    #$0000              3
65B5 A3C4       SUBD   ,U                  6
65B7 EDC4       STD    ,U                  5
65B9 0EB6       JMP    /$B6                3
65BB FF         FF
65BC 47         ASRA                       2
65BD 56         RORB                       2
65BE 47         ASRA                       2
65BF 56         RORB                       2
65C0 47         ASRA                       2
65C1 56         RORB                       2
65C2 47         ASRA                       2
65C3 56         RORB                       2
65C4 39         RTS                        5
EDIT : J'ai fini par faire la division par 2 ainsi

Code : Tout sélectionner

( a , b ... a/2 , b/2)
: SCALE >R 2 / R> 2 / ; 
CREATE SCALE 8D02 , 0EB6 , EC42 , 2C10 , CC C, 0 , A342 , 4756 , ED42 , CC C, 0 , A342 , 2002 , 4756 , ED42 , ECC4 , 2C10 , CC C, 0 , A3C4 , 4756 , EDC4 , CC C, 0 , A3C4 , 2002 , 4756 , EDC4 , 39 C, SMUDGE
7115 8D02       BSR    $7119               7
7117 0EB6       JMP    /$B6                3
7119 EC42       LDD    $02,U               6    // Prend le X
711B 2C10       BGE    $712D               3 // si positif branche  $712D
711D CC0000     LDD    #$0000              3 // sinon D= 0 - D
7120 A342       SUBD   $02,U               7
7122 47         ASRA                       2  // ... /2
7123 56         RORB                       2
7124 ED42       STD    $02,U               6  ... Sauvegarde provisoire D/2
7126 CC0000     LDD    #$0000              3 .. D = 0 - D/2
7129 A342       SUBD   $02,U               7
712B 2002       BRA    $712F               3 ....Branche sauvegarde D/2 en $712F
712D 47         ASRA                       2 .. Sinon D étant >0 -> D=D/2
712E 56         RORB                       2
712F ED42       STD    $02,U               6 ......sauvegarde D/2
7131 ECC4       LDD    ,U                  5 .......Idem pour les Y
7133 2C10       BGE    $7145               3
7135 CC0000     LDD    #$0000              3
7138 A3C4       SUBD   ,U                  6
713A 47         ASRA                       2
713B 56         RORB                       2
713C EDC4       STD    ,U                  5
713E CC0000     LDD    #$0000              3
7141 A3C4       SUBD   ,U                  6
7143 2002       BRA    $7147               3
7145 47         ASRA                       2
7146 56         RORB                       2
7147 EDC4       STD    ,U                  5
7149 39         RTS                        5
Merci pour votre avis
Modifié en dernier par Dominique le 02 mars 2017 01:27, modifié 1 fois.

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

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 02 mars 2017 00:52

J'ai l'impression que le flag ne sert que localement pour faire un arrondi vers 0, y compris pour les valeurs négatives. En effet ASRA/RORB donne -1 quand on le divise par 2 (et de même -8 /16 donne -1 au lieu de 0). Si tu te fiche que -0.5 soit arrondi à -1 plutôt qu'à 0, ne te casses pas la tête et fait juste ASRA/RORB. Ca ne changera pas grand chose numériquement.

Si par contre l'arrondi vers 0 est important pour les valeurs négatives on peut imaginer un truc comme:

Code : Tout sélectionner

   ...
   ASRA RORB ; div par 2 signée
   ASRA RORB ; div par 2 signée
   ASRA RORB ; div par 2 signée
   ASRA RORB ; div par 2 signée
   TSTA      ; resultat positif? 
   BGE LABEL ; oui => c'est terminé
   ADCB #0   ; non => on ajoute la retenue 
   ADCA #0   ;        pour arrondir vers 0
LABEL:
   ...
pour /2, bien sur il n'y a qu'un seul couple ASRA RORB :)
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 » 03 mars 2017 17:32

Un petit message pour dire que ça progresse et que j'en suis déjà à codifier en ASM l'interprétation des touches du clavier.
Mais je veux déjà anticiper un problème : Certaines touches du clavier vont m'amener à des procédures Forth que je n'ai absolument pas envie de traduire en ASM.
Ainsi par exemple j'ai toute la partie des paramètres par la touche "Q" avec texte et saisie de valeurs. l'Assembler ne me servira à rien ces procédures n'entrant pas dans le mouvement des BOIDS.

Oui mais : comment à partir d'une routine en Langage Machine puis-je appeler un mot Forth et surtout lorsqu'il aura fait son travail, comment le faire revenir dans mon programme ?
J'ai eu beau chercher dans la littérature Forth que je connais, je n'ai pas de solution.

Code : Tout sélectionner

: DDUP OVER OVER ;	

Code : Tout sélectionner

Routine ASM

..
JSR mot1	; mot1 = ASM terminé par RTS - OK
....
??? DDUP ???
....
etc...

; Comment appeler DDUP dont je ne connais que l'adresse CFA et où il n'y a aucun RTS
Ce mot d'appel d'une procédure dont on a le CFA s'appelle EXECUTE, mais je ne peux pas utiliser comme ça.
Et puis comment faire revenir le Forth à ma routine ASM ?

Ce mot n'existe pas, il faut le créer.
Je pense que c'est faisable. :)

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 » 05 mars 2017 10:41

J'ai trouvé dans la littérature des techniques qui permettent d'effectuer un programme ASM à l'intérieur
d'une procédure Forth (Voir Forth Dimension FD-V06N4 page 37 à http://www.forth.org/fd/contents.html )
L'inverse, c'est à dire appeler un mot Forth à l'intérieur d'un ASM ne semblait pas intéresser à l'époque.
J'ai appelé ASM.4 le programme qui fait cela. ( on utilisait souvent 4 pour Forth)

Code : Tout sélectionner

...
programme assembler
...
JSR ASM.4        ; Appel
$nnnn            ; CFA du mot Forth; ' MOT -> PFA -> 2 - donne CFA
...
programme assembler
...
__sam__ a écrit : Plus d'info sur ces histoires de style de threading >>ici<< (en anglais)
Comme l'avait rappelé _sam_ Forth fait partie de ces compilateurs Threaded code.
Et pour le Forth c'est du indirect-threaded code; en bon Français à "adressage indirect"
Tout mot Forth compilé le sera sous la forme d'une adresse, qui ne sera pas l'adresse d'exécution du MOT
mais son adresse indirecte appelée CFA. C'est cette adresse (ou CFA) qui, elle, contiendra l'adresse du code à effectuer.

La technique que je vais utiliser ici est la suivante :
- Sauvegarde du pointeur Y (indispensable )
- Pointage de Y vers une pseudo procédure compilée
- Modification du Program Counter pour sauter au retour le CFA du MOT
- Exécution du CFA du MOT

Pour forcer notre Forth à revenir à notre programme assembler je vais créer un Pseudo-Compilé
qui pointera vers un CFA qui lui pointera sur la fin de ASM.4
- Pseudo Procédure compilée
- CFA de la pseudo procédure compilée
- PFA de la pseudo procédure compilée qui consiste à récupérer le pointeur Y et retourner à précédente routine assembler.

Code : Tout sélectionner

CREATE ASM.4  AEE4 , EC84 , 3606 , 3002 , AFE4 , 8E C, HERE 0D + , 10 C, AF84  , 108E , HERE 8 + , 3710 , 6E94 , 0 , HERE 2+ , HERE 2+ , 8E C, HERE 7 - , 10 C, AE84 , 39 C, SMUDGE
653F AEE4       LDX    ,S                  5 ; Lit le PC
6541 EC84       LDD    ,X                  5 ; Lit CFA du mot à exécuter
6543 3606       PSHU   B,A                 7 ; Préserve dans pile U
6545 3002       LEAX   $02,X               5 ; Avance PC de 2 pour RTS à venir 
6547 AFE4       STX    ,S                  5 ; Dans S
6549 8E6557     LDX    #$6557              3 ; Adresse sauvegarde pointeur Y
654C 10AF84     STY    ,X                  6 ; Sauvegarde
654F 108E6559   LDY    #$6559              4 ; Pointeur assume Pseudo Compilé
6553 3710       PULU   X                   7 ; Prend CFA à exécuter
6555 6E94       JMP    [,X]                6 ; exécute
6557 0000       $0000			            ; Sauvegarde de Y
6559 655B      				                ; Pseudo Compilé	
655B 655D   			                     ; CFA du Pseudo Compilé
655D 8E6557     LDX    #$6557              3 ; PFA - Récupère pointeur Y
6560 10AE84     LDY    ,X                  6
6563 39         RTS                        5 ; Retourne programme ASM
Exemple
Création du mot DDUP

Code : Tout sélectionner

: DDUP OVER OVER ;
Créer ASM.4

Code : Tout sélectionner

CREATE ASM.4  AEE4 , EC84 , 3606 , 3002 , AFE4 , 8E C, HERE 0D + , 10 C, AF84  , 108E , HERE 8 + , 3710 , 6E94 , 0 , HERE 2+ , HERE 2+ , 8E C, HERE 7 - , 10 C, AE84 , 39 C, SMUDGE
Créer l'exemple TESTE

Code : Tout sélectionner

CREATE TESTE BD C, ' ASM.4 , ' DDUP 2- , 0EB6 , SMUDGE

6562 BD653F     JSR    $653F               8    ; Appel ASM.4
6565 6521         				; CFA DDUP
6567 0EB6       JMP NEXT                   3 
asm4.jpg
asm4.jpg (9.2 Kio) Vu 771 fois

Avatar du membre
Papy.G
Modérateur
Messages : 1708
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 » 05 mars 2017 13:14

Comment fait ton Forth pour exécuter une sous-routine sans avoir de RTS (RET) à la fin?
Il charge du code ASM dans un cache d'où il l'exécute? Il le génère à la volée par interprétation?
Il génère une interruption temporisée qui reprend la main juste à la fin de l'exécution de la routine?

Plus j'essaie de suivre pour m'instruire des mécanismes du Forth, moins je comprends. :?
Les processeurs utilisés par tes Forth ont des mécanismes spécifiques que j'ignore. :oops:

PS: C'est curieux, j'aurais plutôt vu tes individus baptisés Bioids. :|
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 » 05 mars 2017 13:53

Pour répondre rapidement et superficiellement à tes interrogations, pas de cache, pas d'interruptions;
Disons que le Forth est une "machine virtuelle" qui fonctionne un peu comme
un micro processeur qui passerait son temps à aller de routines en routines ( disons de procédures en procédures)

Le processeur a un Program Counter -> forth a le sien appelé IP (registre Y)

- Quand le processeur appelle une routine JSR il met le PC dans S et met son PC= adresse appelée par JSR-> Forth met Y dans S (PSHS Y) et met à jour son IP c'est docol
- Quand le processeur rencontre RTS il met le sommet de la pile S dans son PC -> Forth récupère son Y dans S c'est semis
- Quand le processeur exécute une instruction il met son PC vers l'instruction suivante et exécute -> Forth met à jour Y et exécute c'est NEXT

Donc Forth a 3 routines principales :

Code : Tout sélectionner

                     c_docol              
 4D70 3420                    PSHS   Y                  
 4D72 3102                    LEAY   $02,X              
 4D74 0EB6                    JMP    NEXT 

Code : Tout sélectionner

     c_semis
 4C64 3520                    PULS   Y                  
 4C66 0EB6                    JMP    NEXT 

Code : Tout sélectionner

                     NEXT    
 45B6 AEA1                    LDX    ,Y++               
 45B8 6E94                    JMP    [,X]
C'est bien une machine virtuelle qui exécute des adresses indirectes ( par JMP [,X] de NEXT)

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 » 08 mars 2017 16:00

Juste un mot pour vous dire que ça avance vite et que je suis assez content de mes Boids.

1 - par rapport au listing Basic que j'avais donné ici http://forum.system-cfg.com/viewtopic.p ... 60#p125856
je viens de passer en ASM : tout le listing jusqu'à RULE.SEPARATION
Il me reste RULE.COHESION - RULE.ALIGNEMENT - RULES123 et enfin BOIDS (je passe INIT qui ne sert à rien, je l'avais
fait pour relancer le programme après en être sorti .. il n'y a qu'à pas sortir :D )

2 - Le mot ASM.4 qui permet de lancer une procédure Forth dans de l'assembler marche à merveille et m'a permis
de conserver en Forth l'écran de saisie des paramètres. L'écrire en ASM me semblait fastidieux

3 - Comme on ne sait pas trop où se trouve le LEADER sur l'écran et que les Boids deviennent facilement incontrôlables
Je vais faire un point lumineux qui apparaitra des qu'on touchera les flèches. Je vais mettre un point sur les abscisses, un sur les ordonnées pour ne pas afficher le LEADER sur l'écran ; c 'est ce qui me vient à l'esprit.

4 Je vais aussi maintenant mettre un obstacle rond (de couleur) pour voir comment les Boids le contournent.

5 Je suis toujours sur un affichage 80 colonnes. Une étape postérieure sera de doubler pour faire 160 colonnes
et même revenir à un affichage point par point : 320 colonnes. Ce qui va certainement diviser la vitesse par deux.
Mais comme ils sont devenus assez rapides, je pense que c'est faisable.

Je joins les deux fichiers BIN. La vidéo précédente montrait comment les mettre dans la page édition du Forth pour pouvoir
compiler le programme ( Sur DCMOTO aller à Mise au point - adresses 2100 - 4500 LOAD , puis sortir et compiler chaque fichier par 1 LOAD)


BOIDSv3.zip
(5.45 Kio) Téléchargé 16 fois

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

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 08 mars 2017 17:00

Pas mal :) Je me demande s'il ne faudrait pas aussi ajouter une touche pour faire fuire tous les BOIDs comme si l'on tapait des mains pour effrayer les oiseaux. Cela revient à ré-attribuer des coordonnées aléatoire pour les voir ensuite se rassembler autour du leader.
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 » 08 mars 2017 17:10

Ou un prédateur qui leur fond dessus !
.....
Je me pose la question au sujet du flag écran Forme à $A7C0

Bien que nous ayons suspendu les interruptions par ORCC #$50
à chaque fois que j'affiche ou efface un Boid je fais :

Code : Tout sélectionner

B6A7C0     LDA    $A7C0               5
8A01       ORA    #$01                2
B7A7C0     STA    $A7C0               5
Pour bien m'assurer que je prends l'écran Forme. Même lorsque j'affiche le sprite
du Boid - qui est composé de 4 octets - je fais 4 fois les instructions ci-dessus.
Est-ce bien nécessaire ? ça fait à chaque cycle 17 boids * 4 octets * 2 = 136 fois - car on efface et affiche
chacun d'eux à chaque cycle.
Qu'est ce qui pourrait modifier le flag de $A7C0 ? qu'en pensez-vous ?

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

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 09 mars 2017 06:36

Effectivement ce flag ne change pas tout seul. Tu peux utiliser le débugger de DCmoto en mode "ecriture" plutôt qu'execution pour trouver l'endroit où l'on l'écrit. Ensuite, en déroulant pas à pas les retours d'appel tu tombera sur la fonction qui le modifie.

Nota: si tu fais de l'affichage à l'écran (ou effacement) par les routines standard, alors ce sont surement elles qui interfèrent.
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 » 09 mars 2017 08:21

Merci. Comme je ne m'en servais pas, je ne domine pas les options "write" et "read". Je suppose qu'en cochant "write" on enregistre le défilement jusqu'au point d’arrêt. Mais cette trace se trouve dans un fichier ? Je ne vois pas

Répondre