[Philips] VG5000 Forth

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
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Un grand merci à Daniel, le curseur vient de disparaitre.


http://forthretro.new.fr/download/forthbeta02.zip
(Suivre les memes orientations pour l'installation que la version beta01)

Il ne me reste plus qu'à écrire une notice, ainsi qu'une commande pour retourner au basic, afin que vous profitiez un peu plus de ce compilateur.

A l'attention de ceux qui ont manifesté leur désir de regarder Forth avec un peu plus d'attention : Vous ne pouvez pas savoir la joie que cela me procure !

Ce compilateur version B est tout ce qu'il y a de plus simple et de plus réduit en Forth (il tient de 5500 à 60d0). En fait c'est le 'noyau du Forth' c'est à dire le strict minimum. Il n'est pas 100 % compatible avec le fameux standard FigForth, bien qu'il en soit proche. Ce qui est tout à fait extraordinaire avec Forth, en plus de sa rapidité et du fait d'être aussi compact est qu'on va l'enrichir petit à petit. Un peu comme si nous n'avions acheté qu'une carrosserie, 4 roues, un volant et un moteur et qu'on veuille en faire un bolide de luxe avec toutes les options, GPS, clim, airbag etc.. :D

- Après avoir écrit la notice, je passerai au compilateur FigForth
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [Philips] VG5000 Forth

Message par 6502man »

Très bien, et quelle rapidité de developpement :D
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13253
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: [Philips] VG5000 Forth

Message par Carl »

Bravo Dominique 8)

le simulateur de clavier serait un plus pour injecter un listing :roll: :

Code : Tout sélectionner

: \  0 word drop  ;  immediate

\ Heat Seeker
\ A game for the Jupiter Ace

\ Copyright (C) 2009 Marcos Cruz (http://programandala.net)
\ License: http://programandala.net/license

\ Based on "Chase", by Andrew Curtis, 1983:
\ http://www.jupiter-ace.co.uk/listing_PCWeekly_830127p18.html

\ History

\ 2009-06-15 First version.
\ 2009-06-16 Inner loop a bit simplified.


forth definitions  decimal

\ Man

10 variable ym
15 variable xm
ascii x constant man_char 
ascii 5 constant left
ascii 6 constant up
ascii 7 constant down
ascii 8 constant right
: at_man  ( -- )  ym @ xm @ at  ;
: .man  ( -- )  at_man man_char emit  ;
: -man  ( -- )  at_man space  ;
: key  ( c -- u )  inkey = 2 *  ;
: man>x  ( -- )  xm @ left key - right key + 1 max 30 min xm !  ;
: man>y  ( -- )  ym @ up key - down key + 1 max 20 min ym !  ;
: man>  ( -- )  man>x man>y  ;
: man  ( -- )  -man man> .man  ;

\ Missile

1 variable yr
1 variable xr
ascii * constant rocket_char
: at_rocket  ( -- )  yr @ xr @ at  ;
: .rocket  ( -- )  at_rocket rocket_char emit  ;
: -rocket  ( -- )  at_rocket space  ;
: +coord  ( coord1 coord2 -- coord3 )  over > +  ;
: -coord  ( coord0 coord1 coord2 -- coord3 )  < negate +  ;
: rocket>y  ( -- )  yr @ ym @ +coord  ym @ yr @ -coord  yr !  ;
: rocket>x  ( -- )  xr @ xm @ +coord  xm @ xr @ -coord  xr !  ;
: rocket>  ( -- ) rocket>x rocket>y  ;
: rocket  ( -- )  -rocket rocket> .rocket  ;

\ Instructions

: .about  ( -- )
	cr ." Heat Seeker"
	cr
	cr ." Copyright (C) 2009 Marcos Cruz"
	cr ." http://programandala.net"
	cr ." License:"
	cr ." http://programandala.net/license"
;
: .key  ( c -- )  emit space ;
: .keys  ( -- )  left .key  up .key  down .key  right .key  ;
: .player  ( c -- )  ascii ( emit emit ascii ) emit  ;
: .objective  ( -- )
	cr ." The objective is to dodge the"
	cr ." heat guided missile (" rocket_char .player ascii ) emit
	cr ." for as long as possible." 
	cr ." You ( " man_char .player ." ) can move twice as"
	cr ." fast as the missile but it can"
	cr ." move diagonally..."
; 
: .start  ( -- )  cr ." Type RUN and press ENTER."  ;
: .press  ( -- )  cr ." Press any key to start."  ;
: pause  ( -- )  begin  inkey  until  ;
: .instructions  ( -- )  cr ." Control keys: " .keys cr .objective  ;

\ Init

: page  ( -- )  cls invis  ;
: init_coords  ( -- )  10 ym ! 15 xm !  1 dup yr ! xr !  ;
: init_round  ( -- )  cls init_coords  ;
: init_game  ( -- )  page .about cr .instructions cr .press pause cls  ;

\ Yes/No

: lowercase  ( c1 -- c2 )  32 or  ;
: y/n=  ( c1 -- c2 f )  lowercase dup ascii y = over ascii n = or  ;
: y/n  ( -- c )  0 begin drop inkey y/n= until  ;
: more?  ( -- f )  11 13 at ." More?"  y/n ascii y =  ;

\ End

: (blast)  ( -- )  .man  64 0  do  loop  .rocket  ;
: blast  ( -- )  256 0  do  (blast)  loop  -rocket  ;
: end  ( -- )  cls ." Bye!" vis  ;
: game_over  ( -- )  blast 10 11 at ." Game Over"  250 1000 beep  ;

\ Main

: bleep  ( -- ) 250 70 beep  ;
: leave?  ( -- f )  more? 0=  ;
: crash?  ( -- f )  ym @ yr @ = xm @ xr @ = and  ;
: (round)  ( -- )  bleep man rocket  ;
: round  ( -- )  
	init_round  begin  (round) crash?  until  game_over
;
: heat_seeker  ( -- )  init_game  begin  round leave?  until  end  ;
: run  ( -- )  heat_seeker  ;

page .about cr .start
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Hé hé hé, Carl

Je vois que tu es passé voir les amis de Jupiter Ace. :D

Il me faut d'abord trouver un moyen d'enregistrer notre compilateur au fur et à mesure que nous lui rajoutons des mots dans son dictionnaire.
J'ai envi d'aller au plus rapide : un retour au Basic et de là faire un CSAVEM du compilateur agrémenté des nouvelles commandes.
L'idéal serait bien entendu de faire un CSAVE et un CLOAD à partir du Forth. Mais on verra plus tard.

Chiche pour Heat Seeker !

(OBS : Marcos Cruz est un brésilien, comme quoi au Brésil on a été à bonne école. Là bas nous nous nourrissions d'une revue très bien faite - Micro Sistemas -)
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Carl a écrit :
le simulateur de clavier serait un plus pour injecter un listing :roll: :
J'imagine que le simulateur permet de saisir le texte dans un fichier txt.
Mais je ne vois pas comment l'injecter dans le VG5000 ni où.

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

Re: [Philips] VG5000 Forth

Message par Dominique »

Le retour au basic est en fait beaucoup plus simple qu'il ne semblait au départ :

1 - On va créer deux mots très utiles qui sont HEX et DECIMAL. Forth possède une variable, appelée BASE
qui, comme son nom l'indique est la base numérique. Pour travailler avec des hexadécimaux il faut mettre
10 dans la base, et pour travailler avec des décimaux il faut mettre 0A (puisque par défaut nous sommes en hexa).
Voici comment faire :

CLS <NL> \ histoire de nettoyer l'écran

: HEX 10 BASE ! ;
: DECIMAL 0A BASE ! ;

2 - Comme on l'a vu dans les messages précédents on a désactivé les interruptions par la commande en LM 'DI'
Pour revenir au BASIC il faudra les re activer ce qui se fait par 'EI' (code FB)
3 - Comme Forth se sert de la pile SP, j'avais enregistré au départ l'adresse de SP dans la variable à l'adresse 5526h
- instruction LD (5526h), SP
On fera l'inverse soit LD SP, (5526h) - ED 7B 26 55
4 - Le livre sur 'les clefs du VG5000' conseille de préserver le registre HL au départ pour le récupérer avant de revenir au Basic.
Pour cette raison je fais un PUSH HL - E5 au départ du compilateur. Il suffira de faire un POP HL - E1.
5 - Il ne reste plus qu'à faire RETURN - C9 pour revenir au Basic.

Ecrivons avec le Forth le programme en LM

CREATE BASIC FB C, ED C, 7B C, 5526 , E1 C, C9 C,

6 - Nous aurons besoin, pour enregistrer le compilateur de l'adresse 5500h en décimales.

HEX 5500 DECIMAL . <NL> 21760

et de sa longueur.

La variable du Forth HERE, donne l'adresse de fin du compilateur (auquel nous avons rajouté des mots)

Donc, pour calculer la longueur du compilateur, faire

HEX \revenons en hexa

HERE 5500 - DECIMAL . <NL> 3080

on note l'adresse de départ et la longueur, on fait
BASIC <NL>
Image
Dernière modification par Dominique le 24 mars 2010 00:23, modifié 1 fois.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

et dans le Basic (après avoir chargé la K7)
CSAVEM "FORB", 21760, 3080

Image
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Philips] VG5000 Forth

Message par Daniel »

Bravo Dominique 8)

Pour que le retour au Basic soit parfait, il reste peut-être à remettre le curseur :?:

La simulation du clavier dans dcvg5k permet de lire un fichier texte et de positionner les bits des ports 0x80-0x87 comme l'appui sur une touche, en fonction du caractère lu. Normalement ce mécanisme doit permettre la saisie automatique d'un programme dans l'éditeur Forth. J'ai ajusté la vitesse de frappe aux possibilités de l'éditeur Basic. Si elle est trop rapide pour le Forth je peux la diminuer.

Suite à ce regain d'intérêt pour le Forth, j'ai mis sur le site dcmoto, à la page http://dcmoto.free.fr/onlinedoc/index.html , le livre Initiation au Forth S.E.F.I. de Cedic Nathan. Il est destiné aux machines Thomson, mais les concepts sont probablement identiques à ceux du Forth VG5000 :?:

Image
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13253
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: [Philips] VG5000 Forth

Message par Carl »

merci Dominique pour cette nouvelle version et les commentaires qui vont avec car je découvre la chose...
Merci Daniel pour le bouquin...

Dominique, à chaque fois que tu ajoutes des nouvelles fonctions, il faut faire un csavem, comment détérmines tu la longueur (ex :3080 octets) ?

pourquoi ne pas mettre lors du CSAVEM "FORB", 21760, 3080, 22062
afin que le forth démarre en auto...

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

Re: [Philips] VG5000 Forth

Message par Dominique »

Carl a écrit :Dominique, à chaque fois que tu ajoutes des nouvelles fonctions, il faut faire un csavem, comment détérmines tu la longueur (ex :3080 octets) ?


Salut Carl
1 - Pour calculer la longueur du compilateur, qui augmentera au fur et à mesure que nous y rajouterons du vocabulaire :
La variable HERE ( taper simplement HERE <NL> met au sommet de la pile la prochaine adresse de compilation disponible. On peut la connaitre donc comme ça (ne pas oublier les espaces)

Code : Tout sélectionner

HEX HERE . <NL> 6108 OK 
Comme on connait le début du compilateur (5500h), on trouve la longueur par la différence :

Code : Tout sélectionner

HERE 5500 - . <NL> C08 OK 
Pour ramener tout ça en décimal, on a l'embarras du choix :

Code : Tout sélectionner

HEX HERE 5500 - DECIMAL . <NL> 3080  OK 
ou bien

Code : Tout sélectionner

HEX C08 DECIMAL . <NL> 3080 OK
Carl a écrit : pourquoi ne pas mettre lors du CSAVEM "FORB", 21760, 3080, 22062
afin que le forth démarre en auto...
j'avais essayé, mais ça me donnait une erreur (genre ligne inconnue, je ne me souviens pas)
Tu y es arrivé ?
J'ai pensé mettre un appel depuis le BASIC, et il suffisait de faire un RUN

Code : Tout sélectionner

20 CALL &"562E"
Dominique
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Daniel a écrit :Pour que le retour au Basic soit parfait, il reste peut-être à remettre le curseur :?:
C'est pour ça que dans la nouvelle version beta, la routine qui désactive et reactive le curseur sera la suivante, A contenant la valeur 2E ou 6E selon le cas

Code : Tout sélectionner

             push AF
3e20      ld      a,20h        ;20=Status
d38f      out     (8fh),a
3e82      ld      a,82h        ;82=Indirect
d3cf      out     (0cfh),a
cd8602  call   0286h       ; attente EF9345 pret
3e29      ld      a,29h        ;29=Data register R1 + exec request
d38f      out     (8fh),a
            pop AF              ; 2e ou 6e
d3cf      out     (0cfh),a       ;ecriture dans R1 + commande IND 
Cependant, mystère, j'avais noté que le curseur revenait avec le Basic sans qu'on fasse la routine.
De toute façon, et pour être logique, je vais la modifier comme ci dessus dans la prochaine version
Daniel a écrit :Image
Merci pour le lien, je vais regarder ça.
La prochaine étape sera :
- Faire l'éditeur Forth pour taper, corriger et compiler nos programmes
- Avec cet éditeur on pourra mettre le jeu qu'a donné Carl.

Au sujet de ton interface "simulation clavier" j'y vois des possibilités fascinantes de pouvoir dialoguer avec le Forth via le fichier Text.
Cependant, et nous en parlerons bientôt, en plus des caractères ASCII, Forth a besoin de la longueur de la chaine.
Par exemple :
Si j'ai tapé les commandes :

Code : Tout sélectionner

HEX HERE 5500  .  <NL>
dans son buffer ( tu peux le lire à partir de l'adresse 4FFE) Forth aura

10 00 48 45 58 20 48 45 52 45 20 35 35 30 30 20 2E 20 FF

10 00 est la longueur de la chaine
48 45 58 etc... sont les caractères ASCII de la commande
FF marque la fin de la chaine.

Obs : ne te fixe pas sur l'adresse 4ffe, Forth est parfaitement paramétrable et, à partir de Forth lui même, on peut modifier l'adresse du Buffer. C'est d'ailleurs le principe de l'éditeur Forth : On change l'adresse du buffer qu'on met où on veut, on fait un autre buffer à la suite, puis un autre etc... Comme ça on a un brouillon modifiable. divisé en plusieurs lignes, puis on lui dit de compiler les lignes les unes après les autres. Mais le format de la chaine de chaque buffer est toujours la même avec longueur de la chaine et FF en fin
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Nouvelle version

http://forthretro.new.fr/download/forthbeta03.zip Corrigé

http://forthretro.new.fr/download/forthbeta04.zip

principaux points :

1 - Modifications de la routine du curseur et retour au BASIC selon dit plus haut. corrigé
2 - Modif de l'adresse du compilateur. Je l'ai baissé de l'adresse 5500 à 5200 (le Buffer toujours à 5000).
200 me semble largement suffisant pour le buffer et nous gagnons 300 en mémoire haute, ce qui est important pour le 16 K
3 - Voir fichier txt joint dans le zip pour les nouvelles adresses.
Pour enregistrer, prendre note que l'adresse de début est devenue 5200 et non plus 5500 !!
4 - Nous sommes tout près de la version définitive. Cependant je voudrai remanier l'affichage afin de re intégrer la fameuse ligne 0 (voir discussion précédentes)

5 - Ce soir des tonnes de vocabulaire à intégrer à ce noyau pour en faire un compilateur digne de ce nom
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

http://forthretro.new.fr/download/forthbeta05A.zip

Deux fichiers inclus :

Un beta05A (juste le noyau corrigé d'un bug, avec le mot BASIC pour revenir au Basic)
Un Forthp3 qui comprend un premier vocabulaire qui le rend + complet.

Ce Forthp3. est le beta05A avec tout le vocabulaire qui suit.
Pour obtenir le vocabulaire disponible dans le forthp3 :

VLIST <NL>






Vocabulaire inclus à partir du noyau (Définitions en mode HEX)....

***************
http://img179.imageshack.us/img179/9739/vocp1.jpg

Code : Tout sélectionner

: IMMEDIATE ENTRY DUP DUP C@ 1+ + DUP @ CURRENT @ ! COMPILER @ SWAP ! COMPILER ! ;

: DO 59B6 DO, ; IMMEDIATE

: LOOP 5A14 END, ; IMMEDIATE

: BEGIN HERE ; IMMEDIATE

: UNTIL *# *END END, ; IMMEDIATE

: WHILE *# *IF DO, 0 C, ; IMMEDIATE

: REPEAT SWAP *# *WHILE END, HERE OVER - SWAP C! ; IMMEDIATE

: FORGET CURRENT @ CONTEXT ! ' DUP BEGIN COMPILER @ OVER OVER < WHILE DUP C@ + 1+ @ COMPILER ! REPEAT DROP 2 - @ CURRENT @ ! DP @ C@ 3 + - DP ! ;

: DECIMAL 0A BASE ! ;

: HEX 10 BASE ! ;
Image

Code : Tout sélectionner

: +LOOP 5A38 END, ; IMMEDIATE

: LEAVE 5A42 , ; IMMEDIATE

: ." *# *( , 22 TOKEN HERE  C@ 1+ DP +! ; IMMEDIATE

: MIN OVER OVER > IF SWAP THEN DROP ;

: MAX OVER OVER < IF SWAP THEN DROP ;

: ALLOT DP +! ;

: / 0 SWAP D/MOD DROP ;

CREATE OR E1 C, D1 C, 7D C, B3 C, 6F C, 7C C, B2 C, 67 C, E5 C, NEXT

CREATE NOT E1 C, 7D C, B4 C, 11 C, 0 , 20 C, 01 C, 1C C, D5 C, NEXT

: /MOD 0 SWAP D/MOD SWAP ;
Image

Code : Tout sélectionner

CREATE AT E1 C, D1 C, AF C, 7B C, C6 C, 08 C, 67 C, 2C C, 22 C, 5258 , NEXT

: LIST DUP DUP 2 - @ + SWAP DO I C@ EMIT LOOP ;

CREATE LIST-WORD E1 C, 5E C, 23 C, CD C, 5517 , 23 C, 5E C, 23 C, 56 C, D5 C, NEXT

: LIST-VOC 17 0 AT CR CR BEGIN LIST-WORD DUP 0= NOT IF 17 14 AT LIST-WORD THEN KEY DROP CR DUP 0= UNTIL DROP ;

: VLIST CR ENTRY LIST-VOC CR CR COMPILER @ LIST-VOC CR ;
**************

Forth soit avec vous
Dernière modification par Dominique le 24 mars 2010 22:41, modifié 1 fois.
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13253
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: [Philips] VG5000 Forth

Message par Carl »

Bravo 8)

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

Re: [Philips] VG5000 Forth

Message par Dominique »

Carl a écrit :Bravo 8)

C'est beau ! (mais il dit que c'est pas disponible)
Je me languis de le voir marcher pour de vrai.... Si quelqu'un peut m'indiquer comment transformer K7 en WAV....
Dans le fichier TXT , j'ai commis une erreur. la définition de ." c'est

Code : Tout sélectionner

: ." *# *( , 22 TOKEN HERE  C@ 1+ DP +! ; IMMEDIATE

J'sais pas pourquoi j'ai écrit 0B à la place de 22, puisque le caractère " c'est 22.

En passant je viens de finir le mot INKEY - pas de jeu sans INKEY :D

Code : Tout sélectionner

CREATE INKEY C5 C, AF C, 67 C, E5 C, CD C, 02A7 , CB C, AF C, E1 C, 6F C, C1 C, E5 C, NEXT
ATTENTION à chaque passage INKEY met la valeur de la touche (qui peut être 0 si aucune touche) dans la pile !!!!

Si vous faites une boucle genre :

Code : Tout sélectionner

: TESTE 100 0 DO INKEY  .  LOOP ;
ne pas oublier de faire le . pour vider la pile, sinon elle va exploser :mrgreen:
Répondre