Projet Paint pour MO5 en Forth

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

Répondre
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Projet Paint pour MO5 en Forth

Message par Dominique »

J'ouvre ce message pour commencer le projet PAINT du FORTH MO5.
L’idée est en faire un paint assez complet avec : un effet Élastique (comme si on traçait une ligne depuis un point avec la sourie)
on pourra faire des rectangles, des cercles, des Ellipses, remplir des couleurs, un effet loupe, des Copier/Couper/Coller de parties d'images et la possibilité d'annuler des actions. On doit même pouvoir enregistrer nos œuvres.
On n'en est pas encore là.
L'idée c'est aussi de le rendre le plus explicatif possible (s'il y a intérêt de certains) pour pouvoir le transposer sur d'autres machines FORTH.

Ne me pressez pas trop SVP... Je ne peux pas y travailler tous les jours.
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Projet Paint pour MO5 en Forth

Message par Dominique »

Commençons par le plus simple, un point qui se ballade sur l'écran, avec effet clignotant :
La touche 1 fait le point blanc, la touche 0 le point noir.
La touche Q sort du programme.
On commence par TASK qui sera la borne de début, et on travaillera en base Hexadécimale.

Code : Tout sélectionner

: TASK ; 
HEX  
Ici trois routines créés par __sam__ la semaine dernière qui empêchent et remettent les interruptions.
Elle enlèvent aussi le curseur et son clignotement.
Puis une routine LM de division par 8
On aurait pu garder la séquence d'instructions 8 / , mais c'est toujours autant de temps de gagné.

Code : Tout sélectionner

CREATE DI 1A50 , 0EB6 , SMUDGE 
CREATE EI 1CAF , 0EB6 , SMUDGE 
CREATE /8 ( a ... ent[a/8])ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE 
Créons les constantes des valeurs maxi des Y et des X de l'écran.
Ce Forth ne permet pas de redéfinir des mots existants. X est pris par l’Éditeur, alors créons XA et YA
Idem pour COLOR que nous nommerons COLOUR.

Code : Tout sélectionner

140 CONSTANT XMAX C8 CONSTANT YMAX 
0 VARIABLE XA 0 VARIABLE YA 
0 VARIABLE COLOUR 
On a défini la semaine dernière CASE

Code : Tout sélectionner

0 CONSTANT CASE IMMEDIATE 
: OF 1 + >R COMPILE OVER COMPILE = [COMPILE] IF COMPILE DROP R> ; IMMEDIATE 
: ENDOF  >R  [COMPILE] ELSE  R>  ; IMMEDIATE 
: ENDCASE  COMPILE DROP  0 DO  [COMPILE] ENDIF LOOP ; IMMEDIATE 
Il y a différentes façons de mettre à jour les XA et YA.
Celle ci en vaut une autre. D'ailleurs on recommande toujours en Forth de multiplier les définitions courtes.
8 18 20 10 représentent les valeurs des flèches.
Pour la lisibilité il est important de bien montrer l'évolution de la pile de données.
Ici ( KEYF ...) veut dire que la touche est dans le sommet de la pile, et la pile sera vide à la sortie
Le AND est une astuce de programmation qui permet d'associer la valeur de KEYF = ET le test > à 0 ou < au MAXI etc..
Le AND laissera 1 ou 0 et c'est ce que demande IF.

Code : Tout sélectionner

: X+ 1 XA +! ; : X- -1 XA +! ; 
: Y+ 1 YA +! ; : Y- -1 YA +! ; 
: UP ( Key ...Key) DUP 8 = YA @ 0 > AND IF Y- ENDIF ; 
: DOWN ( Key ...Key) DUP 18 = YA @ YMAX < AND IF Y+ ENDIF ; 
: RIGHT ( Key ...Key) DUP 20 = XA @ XMAX < AND IF X+ ENDIF ; 
: LEFT ( Key ...Key) DUP 10 = XA @ 0 > AND IF X- ENDIF ;  
Ici on calcule : XA, YA - XA, YA, 28 - XA, YA*28, - XA, YA*28, XA - XA, YA*28, ENT(XA/8) - XA, YA*28+ENT(XA/8) - YA*28+ENT(XA/8), XA - YA*28+ENT(XA/8), XAand00000111

Code : Tout sélectionner

: TROUVE-CELL ( XA, YA  ... Adr, Mod8 ) 28 * OVER /8 + SWAP 7 AND  ; 
Forme est une autre définition donnée par __sam__ pour le bit 0 de A7C0 à 1 et avoir accès à l'écran FORME

Code : Tout sélectionner

: FORME A7C0 DUP C@ 1 OR SWAP C! ; 
Le reste, donné par TROUVE-CELL définira le masque OR du PLOT 00000001, 00000010, 00000100 etc...

Code : Tout sélectionner

: MASK-PLOT (Adr, Mod8 ... Adr, MaskPlot)  CASE  0 OF 80 ENDOF 1 OF 40 ENDOF  2 OF 20 ENDOF  3 OF 10 ENDOF  4 OF 8 ENDOF  5 OF 4 ENDOF  6 OF 2 ENDOF  7 OF 1 ENDOF ENDCASE ;
: MASK-UNPLOT    CASE   0 OF 7F ENDOF    1 OF BF ENDOF    2 OF DF ENDOF   3 OF EF ENDOF   4 OF F7 ENDOF   5 OF FB ENDOF   6 OF FD ENDOF   7 OF FE ENDOF   ENDCASE ; 
Par les masques on définit assez facilement PLOT et UNPLOT.
Elles sont ici entres ( ) car on peut avoir à faire un PLOT ou UNPLOT en ayant déjà l'adresse écran dans la pile.
Donc ça évitera de recalculer. On peut aussi plus facilement l'écrire en LM

Code : Tout sélectionner

: (PLOT) (Adr, Mod8 ...) MASK-PLOT OVER FORME C@ OR SWAP FORME C! ; 
: (UNPLOT) (Adr, Mod8 ...) MASK-UNPLOT OVER FORME C@ AND SWAP FORME C! ; 
J'ai mis (?POINT) qui sert à lire la couleur contenue sur l'écran (1 ou 0)

Code : Tout sélectionner

: (?POINT) (Adr, Mod8 ...flag) MASK-PLOT SWAP FORME C@ AND IF 1 ELSE 0 ENDIF ; 
On peut maintenant définir les 3 mots indispensables à tout paint

Code : Tout sélectionner

: UNPLOT (XA,YA ...) TROUVE-CELL (UNPLOT) ; 
: PLOT (XA,YA ...) TROUVE-CELL (PLOT) ; 
: ?POINT (XA,YA ...flag)  TROUVE-CELL (?POINT) ; 
Ici PLOT-POINT décidera selon la couleur

Code : Tout sélectionner

: PLOT-POINT (X,Y...) COLOUR @ IF PLOT ELSE UNPLOT ENDIF ; 
Simple changement de couleur. Noter que COLOUR @ donne 1 ou 0 ce qui est suffisant pour IF

Code : Tout sélectionner

: CHANGE COLOUR @ IF 0  ELSE 1 ENDIF COLOUR ! ; 
Loop de retard

Code : Tout sélectionner

: FLASH CHANGE FA 0 DO LOOP ; 
DRAW n'imprime que les points XA, YA

Code : Tout sélectionner

: DRAW XA @ YA @ PLOT-POINT ; 
Milieu d'écran et couleur blanche

Code : Tout sélectionner

: INIT CLS 64 YA ! A0 XA ! 1 COLOUR ! ;
Teste la touche KEYF sans la détruire

Code : Tout sélectionner

: COLOUR? (Key....Key) DUP A = IF 1 COLOUR ! ELSE DUP 1B = IF  0 COLOUR ! ENDIF ENDIF ; 
Teste la touche KEYF sans la détruire

Code : Tout sélectionner

: ?INPUT ( .... Key) KEYF COLOUR? UP DOWN  LEFT RIGHT ; 
BEGIN UNTIL jusqu'à la touche Q -

Code : Tout sélectionner

: MO4PAINT 7 0 COLOR DI INIT BEGIN ?INPUT FLASH DRAW FLASH DRAW   E = UNTIL  EI CLS ;

Mettre la K7 puis faire 1 9 CLOAD PAINT.

Ensuite faire 1 LOAD

Puis lancer par MO4PAINT

Code : Tout sélectionner

: TASK ; 
HEX  
CREATE DI 1A50 , 0EB6 , SMUDGE 
CREATE EI 1CAF , 0EB6 , SMUDGE 
CREATE /8 ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE 
140 CONSTANT XMAX C8 CONSTANT YMAX 
0 VARIABLE XA 0 VARIABLE YA 
0 VARIABLE COLOUR 
0 CONSTANT CASE IMMEDIATE 
: OF 1 + >R COMPILE OVER COMPILE = [COMPILE] IF COMPILE DROP R> ; IMMEDIATE 
: ENDOF  >R  [COMPILE] ELSE  R>  ; IMMEDIATE 
: ENDCASE  COMPILE DROP  0 DO  [COMPILE] ENDIF LOOP ; IMMEDIATE 
: X+ 1 XA +! ; : X- -1 XA +! ; 
: Y+ 1 YA +! ; : Y- -1 YA +! ; 
: UP DUP 8 = YA @ 0 > AND IF Y- ENDIF ; 
: DOWN DUP 18 = YA @ YMAX < AND IF Y+ ENDIF ; 
: RIGHT  DUP 20 = XA @ XMAX < AND IF X+ ENDIF ; 
: LEFT  DUP 10 = XA @ 0 > AND IF X- ENDIF ;  
: TROUVE-CELL 28 * OVER /8 + SWAP 7 AND  ; 
: FORME A7C0 DUP C@ 1 OR SWAP C! ; 
: MASK-PLOT CASE  0 OF 80 ENDOF 1 OF 40 ENDOF  2 OF 20 ENDOF  3 OF 10 ENDOF  4 OF 8 ENDOF  5 OF 4 ENDOF  6 OF 2 ENDOF  7 OF 1 ENDOF ENDCASE ;
: MASK-UNPLOT    CASE   0 OF 7F ENDOF    1 OF BF ENDOF    2 OF DF ENDOF   3 OF EF ENDOF   4 OF F7 ENDOF   5 OF FB ENDOF   6 OF FD ENDOF   7 OF FE ENDOF   ENDCASE ; 
: (PLOT) MASK-PLOT OVER FORME C@ OR SWAP FORME C! ; 
: (UNPLOT) MASK-UNPLOT OVER FORME C@ AND SWAP FORME C! ; 
: (?POINT) MASK-PLOT SWAP FORME C@ AND IF 1 ELSE 0 ENDIF ; 
: UNPLOT TROUVE-CELL (UNPLOT) ; 
: PLOT TROUVE-CELL (PLOT) ; 
: ?POINT TROUVE-CELL (?POINT) ; 
: PLOT-POINT COLOUR @ IF PLOT ELSE UNPLOT ENDIF ; 
: CHANGE COLOUR @ IF 0  ELSE 1 ENDIF COLOUR ! ; 
: FLASH CHANGE FA 0 DO LOOP ; 
: DRAW XA @ YA @ PLOT-POINT ; 
: INIT CLS 64 YA ! A0 XA ! 1 COLOUR ! ;
: COLOUR?  DUP A = IF 1 COLOUR ! ELSE DUP 1B = IF  0 COLOUR ! ENDIF ENDIF ; 
: ?INPUT KEYF COLOUR? UP DOWN  LEFT RIGHT ; 
: MO4PAINT 7 0 COLOR DI INIT BEGIN ?INPUT FLASH DRAW FLASH DRAW   E = UNTIL  EI CLS ;
edit : Fichier vide - corrigé
Pièces jointes
PaintV1.rar
(979 octets) Téléchargé 122 fois
Dernière modification par Dominique le 22 avr. 2013 23:13, modifié 1 fois.
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Projet Paint pour MO5 en Forth

Message par __sam__ »

La vache! Ca c'est du programme. Bon par contre j'ai un soucis, le fichier PaintV1.k7 est vide!

Si j'essaye un copié collé du code, il bloque car il n'y a pas la définition de "endcase".
Dernière modification par __sam__ le 22 avr. 2013 23:06, modifié 2 fois.
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
fneck
Site Admin
Messages : 17526
Inscription : 01 avr. 2007 12:03
Localisation : Drôme Provençale (26)
Contact :

Re: Projet Paint pour MO5 en Forth

Message par fneck »

Le fichier contenu dans l'archive semble vide?
Fabien https://www.system-cfg.com
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13297
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: Projet Paint pour MO5 en Forth

Message par Carl »

le fichier est bien à zéro....en tout cas merci Dominique pour le tuto, reste plus qu'à trouver le temps de comprendre ce langage :wink:

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

Re: Projet Paint pour MO5 en Forth

Message par Dominique »

Zut ! Veuillez m'excuser ! Erreur de manip. J'espère que ça marche maintenant
Pièces jointes
PaintV1.rar
(979 octets) Téléchargé 120 fois
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13297
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: Projet Paint pour MO5 en Forth

Message par Carl »

j'ai raté quelque chose ?
Image01.jpg
Image01.jpg (15.28 Kio) Consulté 4485 fois
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Projet Paint pour MO5 en Forth

Message par __sam__ »

@carl: Il ne faut pas mettre de "." après le CLOAD PAINT
@domi: ca marche! On peut commencer à écrire un TRON avec ce code :)
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
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Projet Paint pour MO5 en Forth

Message par Dominique »

On va apporter une petite amélioration :
Il serait bon de pouvoir balader notre point sans qu'il imprime de couleurs, disons de façon 'Transparente'
On va créer un Flag, appelé TR qui prendra la valeur 1 pour 'transparent'

Code : Tout sélectionner

0 VARIABLE TR
On va réécrire INIT pour mettre ce flag à 1

Code : Tout sélectionner

: INIT CLS 64 YA ! A0 XA ! 0 COLOUR ! 1 TR ! ;
On va accepter la touche T pour couleur Transparent. Notons que si nous mettons une couleur (0 ou 1) il faut mettre Transparent à 0

Code : Tout sélectionner

: COLOUR?  DUP A = IF 1 COLOUR ! 0 TR !  ELSE DUP 1B = IF  0 COLOUR ! 0 TR ! ENDIF ENDIF DUP 2C = IF 1 TR ! ENDIF ;
Si nous avons choisi Transparent, il faut lire le point sur lequel va se mettre le curseur (par ?POINT) et inverser les couleurs.

Code : Tout sélectionner

: TRANSP  XA @ YA @ ?POINT IF 0 ELSE 1 ENDIF COLOUR ! ;
On va inclure dans la routine MO4PAINT le test "TR @ IF pour passer à Transparent.
Il faut inverser la séquence DRAW FLASH. Je place mon curseur sur une case blanche - TRANSP - me demande d'imprimer du noir ce que fait DRAW- puis Flash remplace par du blanc et le 2° DRAW l'imprime - Le dernier FLASH force l'inversion, mais si je continue en Transparent, ce n'est pas pris en compte..

Code : Tout sélectionner

: MO4PAINT 7 0 COLOR DI INIT BEGIN TR @ IF TRANSP ENDIF ?INPUT DRAW FLASH DRAW FLASH  E = UNTIL  EI CLS ;
J espère que cette fois ça va marcher - La suite peut être demain soir.
Edit :Maintenant OK :D
Pièces jointes
PaintV1-1.rar
(1007 octets) Téléchargé 119 fois
Dernière modification par Dominique le 23 avr. 2013 08:02, modifié 1 fois.
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Projet Paint pour MO5 en Forth

Message par Dominique »

__sam__ a écrit :@carl: Il ne faut pas mettre de "." après le CLOAD PAINT
@domi: ca marche! On peut commencer à écrire un TRON avec ce code :)
:D En tous cas merci pour ton aide ! J'y arrivais pas tout seul.
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Projet Paint pour MO5 en Forth

Message par Dominique »

Le fichier PAINT V1-1 semble OK
Avatar de l’utilisateur
6502man
Messages : 12327
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Projet Paint pour MO5 en Forth

Message par 6502man »

Super ce paint en forth pour MO5 :D
Phil.

www.6502man.com

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

Re: Projet Paint pour MO5 en Forth

Message par Carl »

Animation1.gif
Animation1.gif (10.19 Kio) Consulté 4430 fois
j'arrive à charger le programme (merci sam) et pour dessiner, Dominique ? :roll: :wink:

carl
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Projet Paint pour MO5 en Forth

Message par __sam__ »

Pour dessiner, c'est simple: il faut utiliser les flèches du clavier. 0 trace un "fil" de couleur noir , et 1 de couleur blanche (enfin si je me souviens bien). Cela ressemble un peu au pilotage d'une moto "tron", d'où ma remarque ci-dessus.
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
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Projet Paint pour MO5 en Forth

Message par Dominique »

Oui Carl, les touches 0 et 1 . La touche T pour "Transparent".


J'en suis à la phase autres Couleurs. C'est à dire choisir bleu, rouge, cyan etc...
J'ai décidé de me servir de l'écran pour faire le choix de la couleur qu'on désire peindre. Donc il fallait ouvrir
une fenêtre sur l'écran pour avoir un choix multiple.
Mais si on ouvre une fenêtre sur l'écran on efface une partie du dessin........

Je viens de finaliser la commande qui copie la moitié de l'écran dans la mémoire des screens (comme ça on pourra enregistrer en K7, et celle qui la remet sur l'écran.

MSCR = Main screen

Code : Tout sélectionner

0 CONSTANT MSCR  
CSCR = Copy screen

Code : Tout sélectionner

2100 CONSTANT CSCR
Procédure FOND trouvée par __sam__ (+ le SWAP qui m'a donné du travail. :wink: )

Code : Tout sélectionner

: FOND A7C0 DUP C@ FE AND SWAP C! ;
Comme plus tard on fera une copie totale de l'écran, j'ai appelé cette procédure MINI, car c'est juste la moitié supérieure de l'écran.
CMOVE fait une copie du contenu de 0 vers 2100 puis incrémente 0 et 2100 de 1, ceci FA0 fois.

Code : Tout sélectionner

: >MINI-CSCR MSCR  CSCR FA0 FOND CMOVE MSCR CSCR FA0   1 + +  FA0 FORME CMOVE  ; 
Cette procédure fait l'inverse, c'est à dire recopie la moitié supérieure

Code : Tout sélectionner

:  MINI-CSCR> CSCR MSCR FA0 FOND CMOVE CSCR FA0   1 + + MSCR FA0 FORME CMOVE ;
Ici un CLS de la moitié.

Code : Tout sélectionner

: MINI-CLS FA0 MSCR DO 70 I FOND C! 0 I FORME C! LOOP ;
J'ai testé le tout et ça marche.
Dans la semaine, on appuiera une touche qui ouvrira la fenêtre supérieure de l'écran et on choisira la couleur des points.

A+
Répondre