Forth Sokoban pour VG5000
Modérateurs : Papy.G, fneck, Carl
Re: Forth Sokoban pour VG5000
Ah oui, donc un programme ecrit en forth est compilé avant d'être executé !
Ce qui le place a un niveau bien superieur au basic et au même niveau qu'un autre langage compilé comme le c, fortrtan....
Merci pour ces precisions.
J'aime bien quand j'apprend quelque chose de nouveau
Ce qui le place a un niveau bien superieur au basic et au même niveau qu'un autre langage compilé comme le c, fortrtan....
Merci pour ces precisions.
J'aime bien quand j'apprend quelque chose de nouveau
Re: Forth Sokoban pour VG5000
Attention !
Ce n'est pas de la compilation au sens strict du terme, genre langage C.
Le code de compilation ,n'est autre que l'adresse du Label.
Voici un exemple qui je l'espère aidera à comprendre.
Dans SOKOBAN j'ai défini le mot REG!, de la façon suivante :
REG! veut dire : mettre dans le registre dont le code se trouve dans le Top of Stack, la valeur qui se trouve dans le DOS
CREATE REG! (Valeur, Reg Direct…) E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT
Ce que va faire FORTH, je peux le traduire pour un ASM de la façon suivante :
Supposons maintenant que veuille utiliser REG! comme dans I-REG@ (lire le registre indirect dont la valeur se trouve dans le TOS)
: I-REG@ (Reg-ind …. Valeur)
IND@ \ Commande Lecture Indirecte de Reg-ind
R0 EXEC REG! \ Ecriture dans R0 + Execution
BUSY \ Provoque execution- Attend
R1 REG@ ; \ Lecture du resultat dans R1 - > TOS
Les codes obtenus pourraient se traduire en ASM de la façon suivante
Tu vois donc que la compilation FORTH fournit un pseudo code de compilation qui n'est autre que son adresse.
C'est pour cette raison que FORTH est rapide et compact.
Tu noteras que ASM fait la même chose.
Quand je définis un label comme cf_reg_slash: , ASM ajoute cf_reg_slash: dans son dictionnaire et à chaque fois que tu invoques
cf_reg_slash: , ASM te donnera l'adresse, et seulement l'adresse.
Ce n'est pas de la compilation au sens strict du terme, genre langage C.
Le code de compilation ,n'est autre que l'adresse du Label.
Voici un exemple qui je l'espère aidera à comprendre.
Dans SOKOBAN j'ai défini le mot REG!, de la façon suivante :
REG! veut dire : mettre dans le registre dont le code se trouve dans le Top of Stack, la valeur qui se trouve dans le DOS
CREATE REG! (Valeur, Reg Direct…) E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT
Ce que va faire FORTH, je peux le traduire pour un ASM de la façon suivante :
Code : Tout sélectionner
w_reg_slash:
db $04 ; Longueur du label REG!
db "REG!" ; en ASCII
dw w_regat ; Lien vers le mot (Label) précédent dans le dictionnaire
cf_reg_slash: ; 'code field'
dw c_reg_slash ; ; Lien vers l'adresse d'éxécution
c_reg_slash:
POP DE ; Prend la valeur dans le TOS de la pile SP (c'est le registre direct)
POP HL ; Prend la valeur dans le DOS de la pile SP (c'est la valeur à mettre dans le registre)
PUSH BC ; Sauvegarde le pointer BC de la machine virtuelle
; call $0286 ;attente EF9345 prêt
LD C,$CF
LD A,E
OUT ($8F),A
OUT (C),L
; call $0286 ;attente EF9345 prêt
POP BC
JP next ; Retour à la machine virtuelle
: I-REG@ (Reg-ind …. Valeur)
IND@ \ Commande Lecture Indirecte de Reg-ind
R0 EXEC REG! \ Ecriture dans R0 + Execution
BUSY \ Provoque execution- Attend
R1 REG@ ; \ Lecture du resultat dans R1 - > TOS
Les codes obtenus pourraient se traduire en ASM de la façon suivante
Code : Tout sélectionner
w_i_reg_at:
db $06 ; Longueur du label I-REG@
db "I-REG@" ; Label en ASCII
dw w_ror ; Lien vers le label précédent
cf_i_reg_at: ; Code Field adress
dw c_colon ; adresse d'appel de la machine virtuelle
dw cf_indat ; Adresse Code Field adresse de IND@ précédement définit
dw cf_rzeroc ; Adresse Code Field adresse de R0 précédement définit
dw cf_exec ; Adresse Code Field adresse de EXEC précédement définit
dw cf_reg_slash ; Adresse Code Field adresse de REG! précédement définit <--------
dw cf_busy ; Adresse Code Field adresse de BUSY précédement définit
dw cf_runo ; Adresse Code Field adresse de R1 précédement définit
dw cf_regat ; Adresse Code Field adresse de REG@ précédement définit
dw cf_stop ; Retour à la machine virtuelle
C'est pour cette raison que FORTH est rapide et compact.
Tu noteras que ASM fait la même chose.
Quand je définis un label comme cf_reg_slash: , ASM ajoute cf_reg_slash: dans son dictionnaire et à chaque fois que tu invoques
cf_reg_slash: , ASM te donnera l'adresse, et seulement l'adresse.
Re: Forth Sokoban pour VG5000
Donc si je reprend ton exemple precedent:
...
REG ($FF,Registre)
...
Si j'ai bien compris a l'exeuction il va faire un CALL (adresse de REG) ?
J'ai l'impression d'être un débutant en programmation
Dans ton programme Forth tu ecriras ceci (après avoir crée to label REG) : ?CREATE REG! (Valeur, Reg Direct…) E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT
...
REG ($FF,Registre)
...
Si j'ai bien compris a l'exeuction il va faire un CALL (adresse de REG) ?
J'ai l'impression d'être un débutant en programmation
Re: Forth Sokoban pour VG5000
C'est bien 6502man, j'apprécie tes efforts.
( Valeur, Reg Direct…) dans CREATE REG! ( Valeur, Reg Direct…) E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT
est une 'convention d'écriture' identique à ; en ASM ou // en langage C; c'est à dire que FORTH ne tiendra pas compte de ce qui est après la ( comme ASM ne tient pas compte de ce qui suit un ;
La parenthèse fermé termine le commentaire.
Ici, ( Valeur, Reg Direct…) est juste un rappel pour l'utilisateur de l'état de la pile de données qui doit contenir, dans l'ordre 'la valeur à enregistrer' et 'le code du registre' , les points ... informant que la pile revient vide. Encore une fois, il s'agit d'une convention d'écriture, qui est d'ailleurs indispensable pour suivre l'état de la pile de données qui est critique en Forth
Donc
A - Phase 1 - Définition de REG!
CREATE REG! E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT <NL>
B - Phase 2 Utilisation de REG!
10 21 REG! <NL>
Tu vas mettre 10 dans le registre R1
Si tu regardes le code machine de REG!, tu verras que
POP DE récupère la valeur 21 (qui le code du registre R1)
POP HL récupère la valeur 10
OUT ($8F),21
OUT (CF), 10
Font le travail.
C - Tu peux considérer que Phase 2 Forth fait 'une sorte de' CALL REG!
Regarde les explications données sur mon site
http://pagesperso-orange.fr/forth-retro/machine.htm
( Valeur, Reg Direct…) dans CREATE REG! ( Valeur, Reg Direct…) E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT
est une 'convention d'écriture' identique à ; en ASM ou // en langage C; c'est à dire que FORTH ne tiendra pas compte de ce qui est après la ( comme ASM ne tient pas compte de ce qui suit un ;
La parenthèse fermé termine le commentaire.
Ici, ( Valeur, Reg Direct…) est juste un rappel pour l'utilisateur de l'état de la pile de données qui doit contenir, dans l'ordre 'la valeur à enregistrer' et 'le code du registre' , les points ... informant que la pile revient vide. Encore une fois, il s'agit d'une convention d'écriture, qui est d'ailleurs indispensable pour suivre l'état de la pile de données qui est critique en Forth
Donc
A - Phase 1 - Définition de REG!
CREATE REG! E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT <NL>
B - Phase 2 Utilisation de REG!
10 21 REG! <NL>
Tu vas mettre 10 dans le registre R1
Si tu regardes le code machine de REG!, tu verras que
POP DE récupère la valeur 21 (qui le code du registre R1)
POP HL récupère la valeur 10
OUT ($8F),21
OUT (CF), 10
Font le travail.
C - Tu peux considérer que Phase 2 Forth fait 'une sorte de' CALL REG!
Regarde les explications données sur mon site
http://pagesperso-orange.fr/forth-retro/machine.htm
Re: Forth Sokoban pour VG5000
Je comprend un peu mieux, merci pour toutes ces explications.
Re: Forth Sokoban pour VG5000
Je n'ai toujours pas bien compris ce que faisais le Forth. J'avais juste trouvé sur le Net qu'il existait plusieurs implémentations du Forth: soit interprété, soit interprété/compilé (les fonctions/lables étant compilés lors de leur définition). Je voulais juste savoir si l'implem VG5000 était de l'interprété ou de l'interpréte/compilé ?
Je ne comprends pas bien la comparaison avec l'assembleur qui n'est pas un langage de programmation, juste des instructions machines présentées d'une manière lisible pour un humain. Assembleur = langage machine, c'est à dire des instructions du microprocesseur. Et le Forth doit obligatoirement se traduire en instruction machine comme tout langage, car il semble bien être un langage puisque de plus haut niveau que le simple langage machine.
Forth sur Exl... ce n'est guère possible car ce langage repose sur une utilisation intensive de la pile, et le TMS7020 est très limité coté pile.
Mais il parait marrant ce langage, un peu préhistorique dans la forme... mais il n'est plus utilisé depuis 25ans au moins et plus enseigné depuis 35ans Je n'en ai jamais entendu parlé pendant mes études, ni rencontré personne qui l'utilisait.
Je ne comprends pas bien la comparaison avec l'assembleur qui n'est pas un langage de programmation, juste des instructions machines présentées d'une manière lisible pour un humain. Assembleur = langage machine, c'est à dire des instructions du microprocesseur. Et le Forth doit obligatoirement se traduire en instruction machine comme tout langage, car il semble bien être un langage puisque de plus haut niveau que le simple langage machine.
Forth sur Exl... ce n'est guère possible car ce langage repose sur une utilisation intensive de la pile, et le TMS7020 est très limité coté pile.
Mais il parait marrant ce langage, un peu préhistorique dans la forme... mais il n'est plus utilisé depuis 25ans au moins et plus enseigné depuis 35ans Je n'en ai jamais entendu parlé pendant mes études, ni rencontré personne qui l'utilisait.
Re: Forth Sokoban pour VG5000
Jester,
Pour ce qui est de l'implémentation sur le VG5000 le Forth est une adaptation d'un compilateur que j'avais trouvé en juillet 1983 dans une revue lorsque je vivais au Brésil.
J'en parlais sur mon site.
http://forthretro.new.fr/
Il est du niveau Fig-Forth .
Comme je le dis sur le site, au delà du standard Fig-Forth le langage en lui même ne m'intéresse pas.
Donc qu'il soit préhistorique, non enseigné depuis des lustres etc. ne me perturbe pas outre mesure, pas plus que le fait que nos ordinateurs Exl, VG5000 ou Alice soient également préhistoriques et non utilisés depuis des lustres.
C'est peut être le fait d'être préhistoriques qui en font leur charme.
OBS: j'ignorais même l'existence d'un compilateur Forth qui ne soit qu'interprété, comme quoi.
Pour ce qui est de l'implémentation sur le VG5000 le Forth est une adaptation d'un compilateur que j'avais trouvé en juillet 1983 dans une revue lorsque je vivais au Brésil.
J'en parlais sur mon site.
http://forthretro.new.fr/
Il est du niveau Fig-Forth .
Comme je le dis sur le site, au delà du standard Fig-Forth le langage en lui même ne m'intéresse pas.
Donc qu'il soit préhistorique, non enseigné depuis des lustres etc. ne me perturbe pas outre mesure, pas plus que le fait que nos ordinateurs Exl, VG5000 ou Alice soient également préhistoriques et non utilisés depuis des lustres.
C'est peut être le fait d'être préhistoriques qui en font leur charme.
OBS: j'ignorais même l'existence d'un compilateur Forth qui ne soit qu'interprété, comme quoi.
- Carl
- Modérateur
- Messages : 13300
- Inscription : 08 avr. 2007 13:21
- Localisation : http://www.doledujura.fr
- Contact :
Re: Forth Sokoban pour VG5000
Dominique sur ton site, des liens ne fonctionnenent pas ou plus...la page programme par exemple...
je me lancerai bien dans le forth pour VG5000 mais je sais pas vraiment par quoi commencer sachant que je n'y connais rien...
carl
je me lancerai bien dans le forth pour VG5000 mais je sais pas vraiment par quoi commencer sachant que je n'y connais rien...
carl
Re: Forth Sokoban pour VG5000
Carl,
Tu connais quelqu'un qui commence plusieurs choses à la fois et a du mal à les finir ?
J'en connais un : moi
C'est un peu de la faute au forum qui me donne l'envie de faire mille choses. Je vais me calmer un peu et reprendre tout au départ.
Tu connais quelqu'un qui commence plusieurs choses à la fois et a du mal à les finir ?
J'en connais un : moi
C'est un peu de la faute au forum qui me donne l'envie de faire mille choses. Je vais me calmer un peu et reprendre tout au départ.
- fneck
- Site Admin
- Messages : 17539
- Inscription : 01 avr. 2007 12:03
- Localisation : Drôme Provençale (26)
- Contact :
Re: Forth Sokoban pour VG5000
Hop hop hop, elle est trop facile celle-là, je ne suis pas d'accordDominique a écrit :C'est un peu de la faute au forum qui me donne l'envie de faire mille choses
Fabien https://www.system-cfg.com
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Re: Forth Sokoban pour VG5000
Dominique => un petit cours pour débutant en Forth serait sympa
Au faite est ce que le forth des hector a la même syntaxe ?
Au faite est ce que le forth des hector a la même syntaxe ?
Re: Forth Sokoban pour VG5000
C'est marrant, car la structure même du Forth me fait penser à la structure du RPL, le Reverse Polish Lisp, lngage de programmation des HP-28/48/49/50 (et d'autres modèles pour la programmation de la ROM, même si le RPL n'est pas accessible à l'utilisateur).
Le code de base est en langage machine (normal, c'est le seul truc que le µP comprend), mais sur la quantité totale de routines en LM (les "primitive code objects") est assez faible. Une routine en RPL est en fait une suite d'instructions de sauts à des adresses particulières. Ces adresses particulières pointent vers d'autres structures RPL, qui sont elles-mêmes des suites de sauts à des adresses, qui pointent elles-mêmes vers... etc... etc... Bien sûr à la fin, il y a une routine en LM, mais en fait à partir de quelques routines LM (donc très bas niveau) qui constituent en fait les "atomes" de la ROM de la HP, toutes les autres routines sont des structures RPL.
Tant qu'on reste à la programmation de haut niveau, le RPL utilisateur, on utilise les fonctions "officielles" de la calculatrice : FOR, NEXT, DUP, ROT, etc... Mais on peut aussi se servir de structures RPL "non officielles", i.e. qui ne correspondent pas à des instructions officielles, ce qui permet d'avoir un meilleur contrôle de la machine : c'est le RPL système. Et surtout de faire des progs plus rapides. Ces HP sont désespérément lentes, d'abord du fait de leur µP 4 bits, mais aussi du fait que les instructions officielles comportent pleins de tests pour vérifier la validité des arguments, etc... Ce qui fait qu'on a un langage très robuste, insensible aux erreurs de l'utilisateur, mais lent. En passant au RPL système, on peut "sauter" ces tests, au profit de la rapidité, mais au détriment de la sécurité : si on se plante dans les arguments, on plante totalement la machine, comme lors d'un plantage en LM pur.
Après cela reste plus lent qu'un programme directement pensé en LM, mais c'est beaucoup plus simple pour l'écriture, la mise en oeuvre et le débogage. Une espèce d'intermédiaire entre un langage de bas niveau (LM) et un langage de haut-niveau (BASIC). A ce propos, même si le FORTH est un langage de haut niveau, je pense qu'on peut le considérer comme plus bas-niveau que le BASIC, car on est quand même plus proche de la machine avec lui.
@+
Le code de base est en langage machine (normal, c'est le seul truc que le µP comprend), mais sur la quantité totale de routines en LM (les "primitive code objects") est assez faible. Une routine en RPL est en fait une suite d'instructions de sauts à des adresses particulières. Ces adresses particulières pointent vers d'autres structures RPL, qui sont elles-mêmes des suites de sauts à des adresses, qui pointent elles-mêmes vers... etc... etc... Bien sûr à la fin, il y a une routine en LM, mais en fait à partir de quelques routines LM (donc très bas niveau) qui constituent en fait les "atomes" de la ROM de la HP, toutes les autres routines sont des structures RPL.
Tant qu'on reste à la programmation de haut niveau, le RPL utilisateur, on utilise les fonctions "officielles" de la calculatrice : FOR, NEXT, DUP, ROT, etc... Mais on peut aussi se servir de structures RPL "non officielles", i.e. qui ne correspondent pas à des instructions officielles, ce qui permet d'avoir un meilleur contrôle de la machine : c'est le RPL système. Et surtout de faire des progs plus rapides. Ces HP sont désespérément lentes, d'abord du fait de leur µP 4 bits, mais aussi du fait que les instructions officielles comportent pleins de tests pour vérifier la validité des arguments, etc... Ce qui fait qu'on a un langage très robuste, insensible aux erreurs de l'utilisateur, mais lent. En passant au RPL système, on peut "sauter" ces tests, au profit de la rapidité, mais au détriment de la sécurité : si on se plante dans les arguments, on plante totalement la machine, comme lors d'un plantage en LM pur.
Après cela reste plus lent qu'un programme directement pensé en LM, mais c'est beaucoup plus simple pour l'écriture, la mise en oeuvre et le débogage. Une espèce d'intermédiaire entre un langage de bas niveau (LM) et un langage de haut-niveau (BASIC). A ce propos, même si le FORTH est un langage de haut niveau, je pense qu'on peut le considérer comme plus bas-niveau que le BASIC, car on est quand même plus proche de la machine avec lui.
@+
Re: Forth Sokoban pour VG5000
Un Forth était prévu sur Exl, mais n'a jamais vu le jour (jamais finalisé): on peut le lire sur exelvision.fr
Ce langage semble en effet un bon intermédiaire entre langage de haut niveau et langage machine, il permet une portabilité inter-machines que ne possède pas le langage machine. C'est clairement un langage pour développer des application scientifiques portables, réclamant de bonnes performances.
Mais pour exploiter les possibilités d'une machine sans contrainte, et assurer les meilleures performances, le langage machine reste la seule possibilité sur nos vieilleries.
Je note quand même que réaliser un bon programme sur ce VG5000 est un bel exploit: sur Exl je dispose d'un processeur simple qui accède sans limite bizarre à la mémoire, d'un processeur video avec mode graphique et texte (et mixte) facilement programmable après un début un peu rude (et sans contrainte particulière), d'un synthe vocal pour faire des bruitages (ultra simple à programmer). Je n'avais pas les mêmes contraintes...
Ce langage semble en effet un bon intermédiaire entre langage de haut niveau et langage machine, il permet une portabilité inter-machines que ne possède pas le langage machine. C'est clairement un langage pour développer des application scientifiques portables, réclamant de bonnes performances.
Mais pour exploiter les possibilités d'une machine sans contrainte, et assurer les meilleures performances, le langage machine reste la seule possibilité sur nos vieilleries.
Je note quand même que réaliser un bon programme sur ce VG5000 est un bel exploit: sur Exl je dispose d'un processeur simple qui accède sans limite bizarre à la mémoire, d'un processeur video avec mode graphique et texte (et mixte) facilement programmable après un début un peu rude (et sans contrainte particulière), d'un synthe vocal pour faire des bruitages (ultra simple à programmer). Je n'avais pas les mêmes contraintes...
Re: Forth Sokoban pour VG5000
Nous sommes d'accord, Jester et Kweeky.
Je me souviens d'un programme que j'ai fait pour le ZX81 - Le Mancala, ce fameux jeu Africain.
Il fait appel à ce que nous connaissions dans les années 80 comme début de l'intelligence artificielle : Le fameux algorithme Mini Max avec élagage Alpha Beta.
On peut bien entendu reproduire la logique du Mini Max en Basic, mais il ne faut pas être pressé dès qu'on demande à l'ordinateur une analyse au 3° niveau.
On peut bien entendu l'écrire en LM, mais il faut vraiment se concentrer, c'est difficilement transposable d'une machine à l'autre sur le LM et généralement seulement lisible de celui qui l'a fait.
Or, en Forth, l'algorithme est très exactement comme celui donné sur Wikipedia
http://fr.wikipedia.org/wiki/%C3%89lagage_alpha-beta
Chacun trouve son plaisir où il veut et où il peut, mais moi me dire qu'avec le compilateur Forth je peux écrire sur le ZX81 (ou le VG 5000) cet algorithme, tel qu'il est sur Wikipedia, je trouve ça fascinant.
Au sujet du Forth, je pensais au manuel d'utilisation pendant que je descendais à Montpellier. Je m'y mettre sérieusement.
Je me souviens d'un programme que j'ai fait pour le ZX81 - Le Mancala, ce fameux jeu Africain.
Il fait appel à ce que nous connaissions dans les années 80 comme début de l'intelligence artificielle : Le fameux algorithme Mini Max avec élagage Alpha Beta.
On peut bien entendu reproduire la logique du Mini Max en Basic, mais il ne faut pas être pressé dès qu'on demande à l'ordinateur une analyse au 3° niveau.
On peut bien entendu l'écrire en LM, mais il faut vraiment se concentrer, c'est difficilement transposable d'une machine à l'autre sur le LM et généralement seulement lisible de celui qui l'a fait.
Or, en Forth, l'algorithme est très exactement comme celui donné sur Wikipedia
http://fr.wikipedia.org/wiki/%C3%89lagage_alpha-beta
Chacun trouve son plaisir où il veut et où il peut, mais moi me dire qu'avec le compilateur Forth je peux écrire sur le ZX81 (ou le VG 5000) cet algorithme, tel qu'il est sur Wikipedia, je trouve ça fascinant.
Au sujet du Forth, je pensais au manuel d'utilisation pendant que je descendais à Montpellier. Je m'y mettre sérieusement.
Re: Forth Sokoban pour VG5000
Un nouveau Sokoban : BillyBox. Le troisième en quelques mois
Après le Forth sur VG5000, l'Assembleur sur Exelvision, c'est maintenant le Basic sur MO5.
A découvrir dans le forum Serveur87 : http://www.serveur87.com/thread.php?lng ... 1703&cat=3
Après le Forth sur VG5000, l'Assembleur sur Exelvision, c'est maintenant le Basic sur MO5.
A découvrir dans le forum Serveur87 : http://www.serveur87.com/thread.php?lng ... 1703&cat=3
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.