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

Salut à tous,

Si le SOKOBAN n'est pas tout à fait compatible, on peut facilement le rendre compatible.

Il suffit de procéder par étapes pour voir où ça bloque. Je ne sais pas si tu l'as, mais je viens de mettre le fichier source.
C'était il y a 6 ans, autant dire que j'ai à peu près tout oublié de ce que j'avais fait. Mais après avoir relu rapidement ce fichier source, je crois pouvoir t'aider.
1 - Au début du listing il y a un vocabulaire que j'avais été obligé de créer car il n'existait pas dans l'implémentation du Forth Brésilien sur VG5K.
Ces mots existant dans le FIGFORTH, tu n'as pas à les mettre; ce sont :
IMMEDIATE DO BEGIN WHILE REPEAT FORGET DECIMAL HEX ." / OR
Pour ce qui est du mot #IN il s'agit d'un mot qui te permet de saisir une valeur au clavier et le mettre dans la pile
Exemple :

Code : Tout sélectionner

#IN <cr>
123 <cr>
(tu dois avoir la valeur 123 dans le sommet de la pile)
Tu t'en assures en faisant :

Code : Tout sélectionner

. <cr>
123  OK
Comme 5000 était l'adresse du buffer de ce FORTH, essaye la definition suivante :

Code : Tout sélectionner

: #IN BEGIN PAD INPUT BL TOKEN NUMBER UNTIL ;
2 - Comme tu le vois à la fin du listing FORTH, la définition qui fait tourner jeu se nomme
SOKOBAN
La première chose que fait SOKOBAN, après avoir assuré que le compilateur soit en HEX, c'est d'appeler les routines de mise en mémoire des caractères dans le VG5000 par ECRIT-MEM
Regarde la définition de ECRIT-MEM
C'est peut être là que tu as des difficultés.

Dis moi en plus.

Bye
Pièces jointes
SourceSoko.txt
(60.25 Kio) Téléchargé 66 fois
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Bonjour,

merci pour cette réponse détaillée. Je vais commencer par le basique. La commande LBP ne semble pas être du Fig-Forth. Peux-tu le confirmer. Et quel est son role?
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Bonjour,
1 - LBP est une variable spécifique du Forth Bresilien. Sincèrement je ne sais plus à quoi il correspond
:oops: (certainement un buffer spécifique à lui)
Comme le FIG utilise PAD comme buffer temporaire, c'est pour ça que j'avais écrit cette nuit :

: #IN BEGIN PAD INPUT BL TOKEN NUMBER UNTIL ;

Mais sans la tester
De toute façon on aura toujours le temps de reécrire cette fonction #IN en temps voulu.
Je l'avais faite il y a quelques mois, mais je n'avais pas pris de notes
2 - Il me semble que tu as bien avancé sur l'implantation du FIG.
Si tu veux on peut regarder ça vu que je suis un peu plus libre en cette fin d'année.

Tu pourrais m'envoyer un fichier MRX de ton Forth (en me donnant ta version DCMOTO) pour que ça aille plus vite.

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

Re: [Philips] VG5000 Forth

Message par Dominique »

Just un point :

Quand je disais "il suffit de procéder par étapes" je voulais dire que tu prends la définition SOKOBAN (qui est la dernière) et tu regardes que chaque définition à l'intérieur de la définition marche effectivement.

HEX marche bien sur
ECRIT-MEM -> Il faut regarder sa définition (écriture des caractères). Mais comme cette fonction appelle ECRITURE il faut s'assurer que
................. ECRITURE marche etc....
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Voici le fichier rmx. J'ai essayé de taper la définition de la fonction #IN, mais ça n'a pas fonctionné.

Ce que je voudrais c'est écrire une fonction save "nom de programme" et load "nom de programme"
Ce que je ne sais pas faire c'est récupérer l'argument "nom du programme"
Pièces jointes
dcvg5k.mrx.zip
(17.68 Kio) Téléchargé 142 fois
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

J'ai oublié ce matin de te donner la définition de #IN

Code : Tout sélectionner

: #IN 0 0 PAD DUP 3 EXPECT 1- (NUMBER) DROP DROP ;
Elle correspond au INPUT du Basic et permet de saisir des valeurs à l'intérieur d'un programme.

- On va mettre 0 0 dans la pile car (NUMBER) attend 0 0 pour marquer la fin de la chaîne de caractères à convertir en NUMBER. Comme ces deux 0 se retrouveront au sommet de la pile, on les jettera par DROP DROP.
- PAD donne dans la pile l'adresse du Buffer de sortie de texte. Ce Buffer est flottant car il évolue en fonction de l'occupation de l'espace du programme; il se met toujours à 44H espaces de la fin. Si tu tapes PAD sur l'écran, il mettra son adresse actuelle et tu la retrouveras par . <point>
- On duplique l'adresse du PAD car aussi bien EXPECT que (NUMBER) en auront besoin.
- EXPECT mettra dans le PAD les touches ASCII au fur et à mesure qu'on les tape jusqu'à que cette touche soit un <CR> ou atteigne le nombre maxi de caractères attendus; Je l'ai limité ici à 3 (999 tableaux) Mais 2 (99 tableaux) serait aussi suffisant.
- Après EXPECT on se retrouve avec l'adresse du PAD. Mais l'adresse -1 nous donne la longueur de la chaîne de ASCII dans le PAD (ici 0, 1, 2 ou 3)
- (NUMBER) lira les ASCII du PAD et les transformera en un nombre qui se retrouvera sous les deux 0 que nous avions mis comme borne au début.

J'ai testé #IN sur le Forth du MO5 et il marche bien.
A+
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

1- ne semble pas faire partie de fig-forth. Bon c'est facile à rajouter...
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

je viens de le tester sur le Forth dont tu m'as donné le mrx et ça marche. Sauf que comme 1- n'est pas défini, il faut remplacer
1- par
1 - (1 <espace> - )
Edit : oops c'est ce que tu viens de dire
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Je reprends le projet: je voudrais faire une commande cload et csave pour fig-forth

CLOAD nom_de_programme
Mon prototype de fonction est celui-ci:

CLOAD:DW DOCOL
DW ZERO
DW WORD

WORD est pour récupérer le nom_du_programme. Pour utiliser les routines VG5000 de chargement de programme, j'ai besoin de connaitre l'adresse en mémoire de la chaine de caractères nom_de_programme.
Quelqu'un sait-il comment je peux la récupérer?

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

Re: [Philips] VG5000 Forth

Message par Dominique »

Tout ce que tu tapes au clavier se trouve dans le TIB (Terminal Input Buffer)
Dans ton Forth, je ne me souviens plus ou il se trouve, mais tapant

Code : Tout sélectionner

HEX
TIB  .
Il doit te donner l'adresse où se trouve ton texte.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Lorsque j'en aurai fini avec les BOIDS je te promet de revenir sur ta question qui a une solution mais il faudra faire des tas de vérifications.

Au passage, CSAVE que l'on fera plus tard ne doit pas sauvegarder le compilateur et encore moins le compilateur
avec un programme compilé.
La procédure CSAVE doit enregistrer les textes (listings) tels que l'éditeur les tient en mémoire.
On CLOAD(era) le listing du programme, puis une commande LOAD en FORTH compilera le listing.

En attendant je te propose d'adopter provisoirement une solution du type Éditeur pour palier au manque de procédure CSAVE.
Il nous faut :
- Un éditeur de texte type Notepad ++
- Le toujours excellent émulateur de Daniel.

A) Première chose à faire, modifier l'adresse donnée par BLOCK.

Tu trouveras dans ton listing FigForth.z80 la séquence suivante

Code : Tout sélectionner

DB	85H		 ; BLOCK
	DB	"BLOC",'K'+80H
...
et plus bas l'adresse 7000H

La modifier par

Code : Tout sélectionner

DW 	748cH
De cette façon : 8 BLOCK donnera (8-1)*03ECh + 748ch = 9000h

C'est à 9000h que nous mettrons un fichier *.bin que nous compilerons par une commande LOAD.

Voici la définition de la commande :

Code : Tout sélectionner

: LOAD BLK  @  >R  IN  @  >R  0  IN  !  B/SCR  *  BLK ! INTERPRET  R>  IN  !  R>  BLK  !  ;
Sur ton Notepad tu tapes ton listing terminé par ABORT -
Tu enregistres ton fichier au format *.bin

Avec "Mise au Point" tu charges ton fichier adresse 9000.
Procedmini2.jpeg
Procedmini2.jpeg (78.51 Kio) Consulté 6803 fois
Depuis le Forth

Code : Tout sélectionner

1 LOAD 
te compilera ton fichier

B) De plus il faut corriger plusieurs choses qui ne vont pas dans notre FIG-FORTH.
Je vais te les donner à suivre, peut être pourras-tu y travailler.

1 - FORTH possède une constante appelée C/L (Characters/Line)
Elle est à 64 décimal, la modifier à 28h pour notre VG5000

2 - Le plus gros problème est que différentes procédures (VLIST par exemple) utilisent une "variable User" appelée OUT. Cette variable pointe sur la position du curseur écran - de colonne 0 à la colonne fin de ligne -
C'est pour cette raison que la commande VLIST affiche une liste tronquée.
Il ne sert à rien de modifier OUT dans le listing car elle est constamment mise à jour par des procédures.
Il faut revoir nos routines de façon à mettre à jour OUT.

L'adresse de OUT est donnée par :
(UP) + 1Ah -> c'est à dire l'adresse contenue dans UP + 1A
Fait quelque chose comme :

Code : Tout sélectionner

VAROUT:	.EQU	1AH+(UP)
Dans nos routines comme emit_c il faut remplacer EMIT_ADR par VAROUT
Attention VAROUT ne s'occupe que des colonnes .... pas des lignes.
Dernière modification par Dominique le 07 févr. 2017 16:19, modifié 1 fois.
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Merci d'avance pour ton aide. Il est vrai que je galère pas mal avec ce forth.
Ce langage me pose pas mal de problme.
Adapter l'assembleur Z80 et l'interpréteur LISP a été beaucoup plus facile.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Bonjour à tous

Il y a longtemps que je devais terminer le Fig-Forth pour le VG5000. C'est maintenant bien avancé (mais pas terminé)
L'intention de ce post est de tester le compilateur en conditions réelles.
Si quelqu'un peut le tester sur un vrai VG5K - 16K et me donner les résultats, merci.

Lancer le compilateur par CALL&"4A20"
SVP tester les commandes MARGE CARACTERE et FOND comme sur la video (couleurs disponibles NOIR ROUGE VERT JAUNE BLEU MAGENTA CYAN BLANC)
La touche de correction est <Suppr> sur l'émulateur et <Effl Effc> sur le VG réel.

Daniel a été le pionnier et nous a montré il y a plusieurs années qu'il était possible d'afficher en 80 colonnes.
Je me suis permis de m'inspirer de son travail pour écrire ses procédures en FORTH.

- Le programme SAISIE permet d'écrire en 80 caractères jusqu'à faire CR - Merci de tester ce programme.
- Je me suis aventuré dans le semi-graphique pour plus tard faire un Paint.
Sur l'émulateur de Daniel DCVG5K ça marche. - Merci de tester ce programme.

Sinon le compilateur marche bien - Si vous y voyez des bugs c'est qu'il n'est pas encore 100 % - Merci de me les signaler.
Il reste à faire :
-Traquer d'éventuels Bugs
- Faire un éditeur
- Ecrire les procédures CSAVE et CLOAD depuis le Forth (j'en suis incapable et si quelqu'un veut s'y mettre je lui donnerai mon
listing complet. Sinon on passera par le BASIC)
- Une doc complète
- Ecrire des programmes.

Merci


Code : Tout sélectionner

Listing
: TASK ; 
HEX 
: NEXT C3 C, 4AB1 , ; 
20 CONSTANT R0 
21 CONSTANT R1 
22 CONSTANT R2 
23 CONSTANT R3 
24 CONSTANT R4 
25 CONSTANT R5 
26 CONSTANT R6 
27 CONSTANT R7 
CREATE BUSY CD C, 0286 , NEXT SMUDGE 

/Lecture d'un registre direct
CREATE REG@ C5E1 ,  CD C, 0286 , CF0E , 7D C, 8FD3 , 68ED , E5C1 , NEXT SMUDGE 
/ Ecriture dans un registre direct
CREATE REG! E1D1 , C5 C, CD C, 0286 , CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT SMUDGE 

: EXEC 8 + ; 
: IND! 80 + ; 
: IND@ 88 + ; 
1 CONSTANT TGS 
2 CONSTANT MAT 
3 CONSTANT PAT 
4 CONSTANT DOR 
7 CONSTANT ROR 

/Lecture d'un registre indirect
: I-REG@ IND@ R0 EXEC REG! BUSY R1 REG@ ; 
/Ecriture dans un registre indirect
: I-REG! SWAP R1 REG! IND! R0 EXEC REG! BUSY ; 

8 CONSTANT KRF-R 
0 CONSTANT KRF-W 

/ procédure KRF lecture
: KRF@ KRF-R R0 EXEC REG! BUSY ; 
/ Procédure KRF écriture
: KRF! KRF-W R0 EXEC REG! BUSY ; 

0 CONSTANT NOIR 
1 CONSTANT ROUGE 
2 CONSTANT VERT 
3 CONSTANT JAUNE 
4 CONSTANT BLEU 
5 CONSTANT MAGENTA 
6 CONSTANT CYAN 
7 CONSTANT BLANC 

/ <couleur> MARGE
: MARGE MAT I-REG@ F8 AND + MAT I-REG! ; 
/ <couleur> FOND
: FOND R3 REG@ F8 AND OR R3 REG! ; 
/ <couleur> CARACTERE
: CARACTERE 10 * R3 REG@ 8F AND OR R3 REG! ; 

: G0 0 R2 REG@ 8F AND OR R2 REG! ; 
: G10 20 R2 REG@ 8F AND OR R2 REG! ; 
: G11 30 R2 REG@ 8F AND OR R2 REG! ; 
: G20 40 R2 REG@ 8F AND OR R2 REG! ; 
: G21 60 R2 REG@ 8F AND OR R2 REG! ; 

/ Quelques exemples en mode 40 colonnes - Voir les Astuces d'Alice p126
: INCRUST-ON R2 REG@ FE AND R2 REG! ; 
: INCRUST-OFF R2 REG@ 1 OR R2 REG! ; 
: DOUBLEH-ON R2 REG@ 2 OR R2 REG! ; 
: DOUBLEH-OFF R2 REG@ FD AND R2 REG! ; 
: DOUBLEL-ON R2 REG@ 8 OR R2 REG! ; 
: DOUBLEL-OFF R2 REG@ F7 AND R2 REG! ; 
: MASQUE-ON PAT I-REG@ 8 OR PAT I-REG! 4 R2 REG@ OR R2 REG! ; 
: MASQUE-OFF PAT I-REG@ F7 AND PAT I-REG! ; 
: MASQUE-OFF-OFF PAT I-REG@ F7 AND PAT I-REG! FB R2 REG@ AND R2 REG! ; 
: CLIGN-ON PAT I-REG@ 40 OR PAT I-REG! R3 REG@ 8 OR R3 REG! ; 
: CLIGN-OFF R3 REG@ F7 AND R3 REG! ; 
: INVERSION-ON R3 REG@ 80 OR R3 REG! ; 
: INVERSION-OFF R3 REG@ 7F AND R3 REG! ; 

: MODE40 00 TGS I-REG! 77 PAT I-REG! 2E MAT I-REG! 13 DOR I-REG! 8 ROR I-REG! 06 R3 REG! 01 R2 REG! CLS ; 

/Quelques Commandes 80 colonnes (! = écriture @ = lecture )
: KRL!-INC 51 R0 EXEC REG! ; 
: KRL! 50 R0 EXEC REG! ; 
: KRL@ 58 R0 EXEC REG! ; 
: NOP 91 R0 EXEC REG! BUSY ; 
: MVT-STOP F9 R0 EXEC REG! BUSY ;
: MVT-NOSTOP FA R0 EXEC REG! BUSY NOP ;

/ Les procédures et les paramètres de MODE80 PAIR80 IMPAIR80 COPIE80 ECRAN80 CLS80 
/ sont  ceux de Daniel Coulom http://dcvg5k.free.fr/programmes/demo-80-colonnes/index.html
: MODE80 37 PAT I-REG! C0 TGS I-REG! 06 MAT I-REG!  40 DOR I-REG! ;
/ Caractère espace ligne 0 - colonnes paires
: PAIR80 20 R1 REG! 0 R3 REG! 0 R6 REG! 0 R7 REG! KRL!-INC BUSY ; 
/ Colonnes impaires
: IMPAIR80 80 R7 EXEC REG! BUSY ; 
/ Copie dans le tampon
: COPIE80 0 R4 REG! 0 R5 REG! 1 R7 REG! MVT-STOP ; 
/ Recopie triple
: ECRAN80 8 R6 REG! 0 R7 REG! MVT-NOSTOP ; 
/ Procédure CLS écran 80 caractères
: CLS80 PAIR80 IMPAIR80 COPIE80 ECRAN80 ;
/ Identique à PAIR80 sauf le caractère 80h (10000000) à la place de 20h
: PAIR-GRAPH 80 R1 REG! 0 R3 REG! 0 R6 REG! 0 R7 REG! KRL!-INC BUSY ;
/ Procédure CLS écran 80 caractères semi graphique
: CLS-GRAPH PAIR-GRAPH IMPAIR80 COPIE80 ECRAN80 ;

: DEBUT80 MODE80 CLS80 ; 
: NOT 0= ; 

/ test de saisie de caractères sur 80 colonnes jusqu'à la touche CR
0 VARIABLE X80 
0 VARIABLE Y80 
/ (..... ..... )
: NEWLINE80 1 Y80 +! 0 X80 ! ; 
/ (..... ..... )
: AVANCE80 1 X80 +! X80 C@  50 > IF NEWLINE80 THEN ; 
/ (..... X80 C@ , Y80 C@ )
: CALCULEXY80 X80 C@ DUP 1 AND IF 80 ELSE 0 THEN SWAP 2 / + Y80 C@ ; 
/(Caractère .....)
: INREG! R1 REG! CALCULEXY80 R6 REG! R7 REG! ; 
/ Procédure principale
: SAISIE MODE80 CLS80 BEGIN KEY DUP 0D = NOT WHILE AVANCE80 INREG! KRL! BUSY REPEAT DROP ; 

/ Test du tracé d'une ligne en semi-graphique 80 colonnes
: CASE: <BUILDS SMUDGE ] DOES> SWAP 2 * + @ EXECUTE ; 
/ Masque + flag (0=pour registre R3 1=pour registre R1)
/ Voir les Astuces d'Alice p107
: MASQUE81 81 1 ; 
: MASQUE82 82 1 ; 
: MASQUE84 84 1 ; 
: MASQUE88 88 1 ; 
: MASQUE90 90 1 ; 
: MASQUEA0 A0 1 ; 
: MASQUEC0 C0 1 ; 
: MASQUE20 20 0 ; 
: MASQUE3 3 0 ; 
: MASQUE40 40 0 ; 
: MASQUE80 80 0 ; 
: MASQUE4 4 0 ; 
: MASQUE8 8 0 ; 
/ (retenue colonne * 4) + (retenue ligne) = choix du masque
CASE: VALEUR-MASQUE MASQUE81 MASQUE82 MASQUE81 MASQUE82 MASQUE84 MASQUE88 MASQUE84 MASQUE88 MASQUE90 MASQUEA0 MASQUE90 MASQUEA0 MASQUEC0 MASQUE20 MASQUEC0 MASQUE3 MASQUE40 MASQUE80 MASQUE4 MASQUE8 ; 

/Mise à jour de R6 - Pile -> (.... reste de Y80/5)
: MAJ-R6 Y80 C@ 5 /MOD DUP 0= NOT IF 7 + THEN R6 REG! ; 
/Mise à jour de R7 - Pile -> (.... reste de X80/4)
: MAJ-R7 X80 C@ 4 /MOD SWAP DUP >R 2 < IF 0 ELSE 80 THEN + R7 REG! R> ; 

/ Mise à jour de R1 ou R3 selon masque
: MAJ-R1-R3 MAJ-R7 MAJ-R6 4 * + VALEUR-MASQUE IF KRL@ BUSY G R1 REG@ OR R1 REG! ELSE KRL@ BUSY R3 REG@ OR R3 REG! THEN ; 
/ Procédure principale
: LIGNE-GRAPH MODE80 CLS-GRAPH 20 0 DO 1 X80 +! 1 Y80 +! MAJ-R1-R3 KRL! BUSY LOOP KEY DROP MODE40 ;   
Pièces jointes
Forth16k.zip
(7.55 Kio) Téléchargé 120 fois
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Bonjour à tous

Il y a longtemps que je devais terminer le Fig-Forth pour le VG5000. C'est maintenant bien avancé (mais pas terminé)
L'intention de ce post est de tester le compilateur en conditions réelles.
Si quelqu'un peut le tester sur un vrai VG5K - 16K et me donner les résultats, merci.

Lancer le compilateur par CALL&"4A20"
SVP tester les commandes MARGE CARACTERE et FOND comme sur la video (couleurs disponibles NOIR ROUGE VERT JAUNE BLEU MAGENTA CYAN BLANC)
La touche de correction est <Suppr> sur l'émulateur et <Effl Effc> sur le VG réel.

Daniel a été le pionnier et nous a montré il y a plusieurs années qu'il était possible d'afficher en 80 colonnes.
Je me suis permis de m'inspirer de son travail pour écrire ses procédures en FORTH.

- Le programme SAISIE permet d'écrire en 80 caractères jusqu'à faire CR - Merci de tester ce programme.
- Je me suis aventuré dans le semi-graphique pour plus tard faire un Paint.
Sur l'émulateur de Daniel DCVG5K ça marche. - Merci de tester ce programme.

Sinon le compilateur marche bien - Si vous y voyez des bugs c'est qu'il n'est pas encore 100 % - Merci de me les signaler.
Il reste à faire :
-Traquer d'éventuels Bugs
- Faire un éditeur
- Ecrire les procédures CSAVE et CLOAD depuis le Forth (j'en suis incapable et si quelqu'un veut s'y mettre je lui donnerai mon
listing complet. Sinon on passera par le BASIC)
- Une doc complète
- Ecrire des programmes.

Merci
Forth16k.zip
(7.55 Kio) Téléchargé 128 fois

Code : Tout sélectionner

Listing
: TASK ; 
HEX 
: NEXT C3 C, 4AB1 , ; 
20 CONSTANT R0 
21 CONSTANT R1 
22 CONSTANT R2 
23 CONSTANT R3 
24 CONSTANT R4 
25 CONSTANT R5 
26 CONSTANT R6 
27 CONSTANT R7 
CREATE BUSY CD C, 0286 , NEXT SMUDGE 

/Lecture d'un registre direct
CREATE REG@ C5E1 ,  CD C, 0286 , CF0E , 7D C, 8FD3 , 68ED , E5C1 , NEXT SMUDGE 
/ Ecriture dans un registre direct
CREATE REG! E1D1 , C5 C, CD C, 0286 , CF0E , 7B C, 8FD3 , 69ED , C1 C, NEXT SMUDGE 

: EXEC 8 + ; 
: IND! 80 + ; 
: IND@ 88 + ; 
1 CONSTANT TGS 
2 CONSTANT MAT 
3 CONSTANT PAT 
4 CONSTANT DOR 
7 CONSTANT ROR 

/Lecture d'un registre indirect
: I-REG@ IND@ R0 EXEC REG! BUSY R1 REG@ ; 
/Ecriture dans un registre indirect
: I-REG! SWAP R1 REG! IND! R0 EXEC REG! BUSY ; 

8 CONSTANT KRF-R 
0 CONSTANT KRF-W 

/ procédure KRF lecture
: KRF@ KRF-R R0 EXEC REG! BUSY ; 
/ Procédure KRF écriture
: KRF! KRF-W R0 EXEC REG! BUSY ; 

0 CONSTANT NOIR 
1 CONSTANT ROUGE 
2 CONSTANT VERT 
3 CONSTANT JAUNE 
4 CONSTANT BLEU 
5 CONSTANT MAGENTA 
6 CONSTANT CYAN 
7 CONSTANT BLANC 

/ <couleur> MARGE
: MARGE MAT I-REG@ F8 AND + MAT I-REG! ; 
/ <couleur> FOND
: FOND R3 REG@ F8 AND OR R3 REG! ; 
/ <couleur> CARACTERE
: CARACTERE 10 * R3 REG@ 8F AND OR R3 REG! ; 

: G0 0 R2 REG@ 8F AND OR R2 REG! ; 
: G10 20 R2 REG@ 8F AND OR R2 REG! ; 
: G11 30 R2 REG@ 8F AND OR R2 REG! ; 
: G20 40 R2 REG@ 8F AND OR R2 REG! ; 
: G21 60 R2 REG@ 8F AND OR R2 REG! ; 

/ Quelques exemples en mode 40 colonnes - Voir les Astuces d'Alice p126
: INCRUST-ON R2 REG@ FE AND R2 REG! ; 
: INCRUST-OFF R2 REG@ 1 OR R2 REG! ; 
: DOUBLEH-ON R2 REG@ 2 OR R2 REG! ; 
: DOUBLEH-OFF R2 REG@ FD AND R2 REG! ; 
: DOUBLEL-ON R2 REG@ 8 OR R2 REG! ; 
: DOUBLEL-OFF R2 REG@ F7 AND R2 REG! ; 
: MASQUE-ON PAT I-REG@ 8 OR PAT I-REG! 4 R2 REG@ OR R2 REG! ; 
: MASQUE-OFF PAT I-REG@ F7 AND PAT I-REG! ; 
: MASQUE-OFF-OFF PAT I-REG@ F7 AND PAT I-REG! FB R2 REG@ AND R2 REG! ; 
: CLIGN-ON PAT I-REG@ 40 OR PAT I-REG! R3 REG@ 8 OR R3 REG! ; 
: CLIGN-OFF R3 REG@ F7 AND R3 REG! ; 
: INVERSION-ON R3 REG@ 80 OR R3 REG! ; 
: INVERSION-OFF R3 REG@ 7F AND R3 REG! ; 

: MODE40 00 TGS I-REG! 77 PAT I-REG! 2E MAT I-REG! 13 DOR I-REG! 8 ROR I-REG! 06 R3 REG! 01 R2 REG! CLS ; 

/Quelques Commandes 80 colonnes (! = écriture @ = lecture )
: KRL!-INC 51 R0 EXEC REG! ; 
: KRL! 50 R0 EXEC REG! ; 
: KRL@ 58 R0 EXEC REG! ; 
: NOP 91 R0 EXEC REG! BUSY ; 
: MVT-STOP F9 R0 EXEC REG! BUSY ;
: MVT-NOSTOP FA R0 EXEC REG! BUSY NOP ;

/ Les procédures et les paramètres de MODE80 PAIR80 IMPAIR80 COPIE80 ECRAN80 CLS80 
/ sont  ceux de Daniel Coulom http://dcvg5k.free.fr/programmes/demo-80-colonnes/index.html
: MODE80 37 PAT I-REG! C0 TGS I-REG! 06 MAT I-REG!  40 DOR I-REG! ;
/ Caractère espace ligne 0 - colonnes paires
: PAIR80 20 R1 REG! 0 R3 REG! 0 R6 REG! 0 R7 REG! KRL!-INC BUSY ; 
/ Colonnes impaires
: IMPAIR80 80 R7 EXEC REG! BUSY ; 
/ Copie dans le tampon
: COPIE80 0 R4 REG! 0 R5 REG! 1 R7 REG! MVT-STOP ; 
/ Recopie triple
: ECRAN80 8 R6 REG! 0 R7 REG! MVT-NOSTOP ; 
/ Procédure CLS écran 80 caractères
: CLS80 PAIR80 IMPAIR80 COPIE80 ECRAN80 ;
/ Identique à PAIR80 sauf le caractère 80h (10000000) à la place de 20h
: PAIR-GRAPH 80 R1 REG! 0 R3 REG! 0 R6 REG! 0 R7 REG! KRL!-INC BUSY ;
/ Procédure CLS écran 80 caractères semi graphique
: CLS-GRAPH PAIR-GRAPH IMPAIR80 COPIE80 ECRAN80 ;

: DEBUT80 MODE80 CLS80 ; 
: NOT 0= ; 

/ test de saisie de caractères sur 80 colonnes jusqu'à la touche CR
0 VARIABLE X80 
0 VARIABLE Y80 
/ (..... ..... )
: NEWLINE80 1 Y80 +! 0 X80 ! ; 
/ (..... ..... )
: AVANCE80 1 X80 +! X80 C@  50 > IF NEWLINE80 THEN ; 
/ (..... X80 C@ , Y80 C@ )
: CALCULEXY80 X80 C@ DUP 1 AND IF 80 ELSE 0 THEN SWAP 2 / + Y80 C@ ; 
/(Caractère .....)
: INREG! R1 REG! CALCULEXY80 R6 REG! R7 REG! ; 
/ Procédure principale
: SAISIE MODE80 CLS80 BEGIN KEY DUP 0D = NOT WHILE AVANCE80 INREG! KRL! BUSY REPEAT DROP ; 

/ Test du tracé d'une ligne en semi-graphique 80 colonnes
: CASE: <BUILDS SMUDGE ] DOES> SWAP 2 * + @ EXECUTE ; 
/ Masque + flag (0=pour registre R3 1=pour registre R1)
/ Voir les Astuces d'Alice p107
: MASQUE81 81 1 ; 
: MASQUE82 82 1 ; 
: MASQUE84 84 1 ; 
: MASQUE88 88 1 ; 
: MASQUE90 90 1 ; 
: MASQUEA0 A0 1 ; 
: MASQUEC0 C0 1 ; 
: MASQUE20 20 0 ; 
: MASQUE3 3 0 ; 
: MASQUE40 40 0 ; 
: MASQUE80 80 0 ; 
: MASQUE4 4 0 ; 
: MASQUE8 8 0 ; 
/ (retenue colonne * 4) + (retenue ligne) = choix du masque
CASE: VALEUR-MASQUE MASQUE81 MASQUE82 MASQUE81 MASQUE82 MASQUE84 MASQUE88 MASQUE84 MASQUE88 MASQUE90 MASQUEA0 MASQUE90 MASQUEA0 MASQUEC0 MASQUE20 MASQUEC0 MASQUE3 MASQUE40 MASQUE80 MASQUE4 MASQUE8 ; 

/Mise à jour de R6 - Pile -> (.... reste de Y80/5)
: MAJ-R6 Y80 C@ 5 /MOD DUP 0= NOT IF 7 + THEN R6 REG! ; 
/Mise à jour de R7 - Pile -> (.... reste de X80/4)
: MAJ-R7 X80 C@ 4 /MOD SWAP DUP >R 2 < IF 0 ELSE 80 THEN + R7 REG! R> ; 

/ Mise à jour de R1 ou R3 selon masque
: MAJ-R1-R3 MAJ-R7 MAJ-R6 4 * + VALEUR-MASQUE IF KRL@ BUSY G R1 REG@ OR R1 REG! ELSE KRL@ BUSY R3 REG@ OR R3 REG! THEN ; 
/ Procédure principale
: LIGNE-GRAPH MODE80 CLS-GRAPH 20 0 DO 1 X80 +! 1 Y80 +! MAJ-R1-R3 KRL! BUSY LOOP KEY DROP MODE40 ;   
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: [Philips] VG5000 Forth

Message par Mokona »

Ah, super. Je ne suis pas chez moi en ce moment, mais si personne ne l'a fait entre temps, j'essaierai sur un vrai VG5000.
Répondre