[FORTH] Le mécanisme Forth

Tout ce qui concerne le logiciel original et sa sauvegarde avec entre autre la régénération des disquettes ou autres supports physiques.

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [FORTH] Le mécanisme Forth

Message par Dominique »

Merci à toi jice,

Une chose que je n'avais pas dite mais que certains ont du noter est que :

Une des trois routines de la Machine Virtuelle se nomme "docol" qui vient de l'anglais "Do Colon" (faire deux points)

L'autre de nomme "semis" qui est en anglais (Point Virgule)

Qui a eu la curiosité de tester le Forth a bien vu que pour déclarer un mot en Forth on fait

: NNNN blablabla ;

Ceci expliquant cela
Avatar de l’utilisateur
Theor
Messages : 44
Inscription : 07 juin 2020 20:54

Re: [FORTH] Le mécanisme Forth

Message par Theor »

Bonjour,

Le créateur de FORTH travaille toujours et au fil des ans, a conçu des SoC FORTH, remarquables par leur simplicité architecturale.
Un des plus connu est le J1, facile d'ailleurs à implémenter sur FPGA :
https://www.excamera.com/sphinx/fpga-j1.html
https://github.com/howerj/forth-cpu

Moins connu, le GA144, avec 144 "ordinateurs" FORTH indépendants et parallèles.

En théorie, il se prête bien aux taches parallélisables, DSP comme les calculs FFT, ou l'apprentissage machine.
En pratique, il est peu connu, difficile à se procurer, et difficile à faire fonctionner. Quelques-un s'y sont quand même essayés :
https://hackaday.com/2012/10/03/breadbo ... processor/
https://bitlog.it/20141224_getting_star ... forth.html

On peut s'en procurer un ici, mais la soudure d'un SMD aussi minuscule me fait peur !
https://schmartboard.com/schmartboard-e ... 2-0048-02/
Avatar de l’utilisateur
Theor
Messages : 44
Inscription : 07 juin 2020 20:54

Re: [FORTH] Le mécanisme Forth

Message par Theor »

Par ailleurs, les "ordinateurs" F18A composant le GA144 :
http://www.greenarraychips.com/home/doc ... 2-F18A.pdf
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: [FORTH] Le mécanisme Forth

Message par Mokona »

Ah merci, je ne connaissais pas du tout.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [FORTH] Le mécanisme Forth

Message par __sam__ »

Si je me souviens bien, ces cpus ont la particularité de consommer très peu. En fait ils n'ont pas d'horloge, Ils travaillent au rythme des données qui leur arrivent. C'est un truc très particulier, et très rigolo quand on regarde le jeu d'instructions minimaliste qu'il possède (tout comme le jeu d'instruction du J1). De ce que je me souviens d'avoir lu des white-paper sur green-array ce chip pouvait générer en temps réel logiciellement les signaux VGA.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: [FORTH] Le mécanisme Forth

Message par Mokona »

Je ne connaissais pas du tout le principe des CPUs asynchrones, je lis ça depuis tout à l'heure et je suis fasciné.

Le principe est ancien pourtant, à ce que je lis.
Avatar de l’utilisateur
Theor
Messages : 44
Inscription : 07 juin 2020 20:54

Re: [FORTH] Le mécanisme Forth

Message par Theor »

Tout à fait, d'ailleurs l'IAS de Von Neumann, conçu en 1945, était asynchrone.
https://en.wikipedia.org/wiki/IAS_machine
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [FORTH] Le mécanisme Forth

Message par Dominique »

Excellente intervention Theor; merci

Malheureusement ça me dépasse un peu, mais ceci démontre que contrairement à ce qu'on pourrait penser le FORTH n'est pas une langue morte.
J'ai appris récemment qu'un des instruments de la fameuse sonde Philae avait été piloté par un processeur FORTH.

http://www.octodecillion.com/forth-lang ... -on-comet/
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [FORTH] Le mécanisme Forth

Message par hlide »

Il y a un point sur lequel je trouve Forth difficile : son manque de structuration apparente. Tout semble être à la même ligne et comme il n'y a pas de parenthèse (ce langage n'en a point besoin contrairement au Lisp), ça le rend difficile à lire et probablement aussi à déboguer car ce n'est pas formulé comme dans une langue naturelle (quoique le japonais a bien son verbe toujours à la fin et il doit faire preuve de patience pour savoir si vous l'autorisez ou l'interdisez de faire quelque chose parce que la négation se trouve porté par le suffixe du verbe). ^^

Concernant le F18A, il ne faut pas le considérer comme une alternative au processeur généraliste, mais plutôt à un FPGA dans le cas du GA144.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [FORTH] Le mécanisme Forth

Message par Dominique »

Bonjour à tous,

Il m'est venu l'idée de tester le FIG-FORTH sur le processeur 6803 du ALICE.
Dans un forum dédié au Forth j'ai eu un contact avec M. Joel Rees auteur d'un Fig-Forth pour le 6800 qu'il a optimisé pour le 6801
J'ai donc repris et testé la Machine Virtuelle qu'il a écrite.

- Le manque de registres 16 bits nous oblige à les sauvegarder provisoirement ce qui doit rendre le Forth peu performant.

- je vous laisse tester le programme

Code : Tout sélectionner

                              ;; a09 xxx.txt -b -l   

                              ; Remerciements à M. Joel Rees pour le FIG-FORTH du 6801
                              ; dont il est l'auteur.
                              ; https://osdn.net/users/reiisi/pf/exorsim6801/scm/tree/master/

                              OPT M03         ; Option pour le 6803

                              ORG $4250

 4250 7E428E                  JMP Entree_Forth
                      PROGRAM
 4253 42A4                    FDB cf_somme_recurse

                      IP
 4255 0000                    FDB $0000       ; Pointeur d'adresse
                      W
 4257 0000                    FDB $0000       ; Vecteur
                      RP
 4259 5000                    FDB $5000       ; Pile Retour
                                            ;*****************************************
                                            ; MACHINE VIRTUELLE FORTH BY JOEL REES
                                            ;*****************************************
                      NEXT    
 425B FE4255                  LDX     IP
 425E 08              NEXTWI  INX             pre-increment mode
 425F 08                      INX
 4260 FF4255                  STX     IP
 4263 EE00            NEXT2   LDX     0,X     get W which points to CFA of word to be done
 4265 FF4257          NEXT3   STX     W
 4268 EE00                    LDX     0,X     get VECT which points to executable code
 426A 6E00            NEXTGO  JMP     0,X
                                              ;***************
                      c_docol
 426C FE4259                  LDX     RP      make room in the return stack
 426F 09                      DEX
 4270 09                      DEX
 4271 FF4259                  STX     RP
 4274 FC4255                  LDD     IP      Store address of the high level word
 4277 ED02                    STD     2,X     that we are starting to execute.
 4279 FE4257                  LDX     W       Get first sub-word of that definition
 427C 7E425E                  JMP     NEXTWI  and execute it.
*** warning 1: Long branch within short branch range could be optimized

                                              ;***************
                      cf_semis
 427F 4281                    FDB c_semis             ; Code Field de semis
                      c_semis
 4281 FE4259                  LDX     RP
 4284 08                      INX
 4285 08                      INX
 4286 FF4259                  STX     RP
 4289 EE00                    LDX     0,X     get address we have just finished.
 428B 7E425E                  JMP     NEXTWI  increment the return address & do next word
*** warning 1: Long branch within short branch range could be optimized

                                            ;***********************************
******
                                            ; FIN DE LA MV FORTH
                                            ;***********************************
******

                                            ; Programme principal
                                            ; Somme des entiers naturels
                      Entree_Forth
 428E 8E4500                  LDS     #$4500          ; Pile de données
 4291 CE4700                  LDX     #$4700
 4294 FF4259                  STX     RP              ; Pile Retour
 4297 CE0010                  LDX     #$0010          ; Valeur initiale N
 429A 3C                      PSHX
 429B FE4253                  LDX     PROGRAM         ; Adresse début
 429E FF4255                  STX     IP              ; Sauvegarde dans IP
 42A1 7E4265                  JMP NEXT3
*** warning 1: Long branch within short branch range could be optimized

                      ;*****************
                      ;       : SOMME-RECURSE ( N .. ΣN'0->n') DUP 1- DUP IF RECURSIVE + ENDIF ;
                      ;       Cette définition écrite sur le compilateur donne le programme suivant
                      ;*******************
                      cf_somme_recurse
 42A4 426C                    FDB c_docol             ; c_docol à chaque passage mettra dans la pile Retour RP l'adresse $42B0 qui pointera sur le mot 
									+ après les 2 INX de NEXT
 42A6 42C2                    FDB cf_dup              ; Le TOS de la pile de 
									données est dupliqué pour conserver l'ancienne valeur avant de faire 1- à la nouvelle
 42A8 42EC                    FDB cf_moinsun          ; - 1 sur une des valeur - la pile SP vaudra $10 puis $10 $0F puis $10 $0F $0E puis etc...
 42AA 42C2                    FDB cf_dup              ; Dupliquée car cf_zerobran détruit le sommet
 42AC 42CA                    FDB cf_zerobran         ; Tant que le sommet ne vaut pas zero zerobranche ne fait pas le saut $0004
 42AE 0004                    FDB $0004                       ; Quant il le fera W sera amené à $42B0 + 2 pour faire le +
 42B0 42A4                    FDB cf_somme_recurse    ; sinon W retourne à $424A où c_docol empilera son adresse $42B0 dans RP
 42B2 42B6                    FDB cf_plus             ; Au premier passage le TOS vaut 0 il sera sommé à 1 puis la somme à 2 puis la somme à 3 et....
 42B4 427F                    FDB cf_semis            ; Retire de la pile RP les valeurs laissés par W ($42B0) autant de fois que c_docol les a empilées.
                       
                                            ; *********
                                            ; FIN DU PROGRAMME - SOMME DANS LE TOS DE LA PILE
                                            ; **********
                       
                       
                                            ; MOTS DU VOCABULAIRE
                       
                                            ;************************
                                            ;* LE MOT +
                                            ;************************
                      cf_plus
 42B6 42B8                    FDB c_plus
                      c_plus
 42B8 32                      PULA            commutative
 42B9 33                      PULB
 42BA 30                      TSX
 42BB E300                    ADDD    0,X
 42BD ED00                    STD     0,X
 42BF 7E425B                  JMP     NEXT    ; Optimisation possible par JR NEXT
*** warning 1: Long branch within short branch range could be optimized
                       
                                            ;************************
                                            ;* LE MOT DUP
                                            ;************************
                       
                      cf_dup
 42C2 42C4                    FDB c_dup
                      c_dup
 42C4 38                      PULX
 42C5 3C                      PSHX
 42C6 3C                      PSHX
 42C7 7E425B                  JMP NEXT        ; Optimisation possible par JR NEXT
*** warning 1: Long branch within short branch range could be optimized
                       
                                            ;************************
                                            ;* LE MOT 0BRANCH
                                            ;************************
                      cf_zerobran
 42CA 42CC                    FDB c_zerobran
                      c_zerobran
 42CC 32                      PULA
 42CD 33                      PULB
 42CE C30000                  ADDD    #0      save two cycles, no bytes
 42D1 260E                    BNE     ZBNO
 42D3 FE4255          ZBYES   LDX     IP      Note: code is shared with BRANCH, (+LOOP), (LOOP)
 42D6 EC02                    LDD     2,X
 42D8 F34255                  ADDD    IP
 42DB FD4255                  STD     IP
 42DE 7E425B                  JMP     NEXT
 42E1 FE4255          ZBNO    LDX     IP      no branch. This code is shared with (+LOOP), (LOOP).
 42E4 08                      INX             jump over branch delta
 42E5 08                      INX
 42E6 FF4255                  STX     IP
 42E9 7E425B                  JMP     NEXT    ; Optimisation possible par JR NEXT
                       
                                            ;************************
                                            ;* LE MOT 1-
                                            ;************************
                                             
                      cf_moinsun
 42EC 42EE                    FDB Code_moinsun
                      Code_moinsun
 42EE 38                      PULX
 42EF 09                      DEX
 42F0 3C                      PSHX
 42F1 7E425B                  JMP     NEXT    ; Optimisation possible par JR NEXT
Alice.zip
(2.73 Kio) Téléchargé 92 fois
OBS : On peut bien entendu remplacer les JMP NEXT par des JR NEXT

- Testé sur le DCAlice 2020.08.04 - Mise au point - Fichier Bin chargé à $4250 - Registre PC modifié à $4250 - Pas à Pas

- Après avoir fait un premier Pas à Pas qui nous ramène à docol, on peut mettre un point d'arrêt à $4281 et vérifier l'état de la pile SP qui se trouve au dessus de $44E0

- Un suite d'exécutions en statique nous permet de vérifier que la somme est en train de s'effectuer.

- Ne connaissant pas le Alice comme certains sur ce forum, merci de me faire part de vos observation et améliorations
EDIT : Corrigé l'adresse de départ du fichier BIN - C'était $4250 et non 4550 comme bêtement écrit
Répondre