Forth Sokoban pour VG5000

Cette catégorie traite de développements récents destinés à 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
6502man
Messages : 12332
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Forth Sokoban pour VG5000

Message par 6502man »

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 :D
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Forth Sokoban pour VG5000

Message par Dominique »

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 :

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
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

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


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.
Avatar de l’utilisateur
6502man
Messages : 12332
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Forth Sokoban pour VG5000

Message par 6502man »

Donc si je reprend ton exemple precedent:
CREATE REG! (Valeur, Reg Direct…) E1D1 , C5 C, CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT
Dans ton programme Forth tu ecriras ceci (après avoir crée to label REG) : ?
...
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 :oops:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Forth Sokoban pour VG5000

Message par Dominique »

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
Avatar de l’utilisateur
6502man
Messages : 12332
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Forth Sokoban pour VG5000

Message par 6502man »

Je comprend un peu mieux, merci pour toutes ces explications.
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
jester
Messages : 2328
Inscription : 01 janv. 2009 23:16
Localisation : Grenoble

Re: Forth Sokoban pour VG5000

Message par jester »

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 :lol: Je n'en ai jamais entendu parlé pendant mes études, ni rencontré personne qui l'utilisait.
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Forth Sokoban pour VG5000

Message par Dominique »

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.
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13300
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: Forth Sokoban pour VG5000

Message par Carl »

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
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Forth Sokoban pour VG5000

Message par Dominique »

Carl,

Tu connais quelqu'un qui commence plusieurs choses à la fois et a du mal à les finir ?
J'en connais un : moi :lol:

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.
Avatar de l’utilisateur
fneck
Site Admin
Messages : 17539
Inscription : 01 avr. 2007 12:03
Localisation : Drôme Provençale (26)
Contact :

Re: Forth Sokoban pour VG5000

Message par fneck »

Dominique a écrit :C'est un peu de la faute au forum qui me donne l'envie de faire mille choses
Hop hop hop, elle est trop facile celle-là, je ne suis pas d'accord :D
Fabien https://www.system-cfg.com
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Avatar de l’utilisateur
6502man
Messages : 12332
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Forth Sokoban pour VG5000

Message par 6502man »

Dominique => un petit cours pour débutant en Forth serait sympa :wink:

Au faite est ce que le forth des hector a la même syntaxe ?
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
kweeky
Messages : 372
Inscription : 24 avr. 2008 18:17
Localisation : Pas très loin de Bordeaux

Re: Forth Sokoban pour VG5000

Message par kweeky »

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.

@+
jester
Messages : 2328
Inscription : 01 janv. 2009 23:16
Localisation : Grenoble

Re: Forth Sokoban pour VG5000

Message par jester »

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...
Avatar de l’utilisateur
Dominique
Messages : 833
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Forth Sokoban pour VG5000

Message par Dominique »

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.
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Forth Sokoban pour VG5000

Message par Daniel »

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

Image
Daniel
L'obstacle augmente mon ardeur.
Répondre